Compare commits
204 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d0cf1132c | |||
| 7ff8689a72 | |||
| b2dd217017 | |||
| e044acea17 | |||
| 29910d4d1b | |||
| e9a6ca9797 | |||
| 8095251eba | |||
| 6508282732 | |||
| ea447495d3 | |||
| c00d002972 | |||
| 83c1254a3e | |||
| e5981769b9 | |||
| d015bb6c92 | |||
| f29910030e | |||
| 8db3c1d220 | |||
| 328cfc0772 | |||
| 9b7e6eda4c | |||
| 059109b064 | |||
| 58ab7f44fa | |||
| c54b01bdc8 | |||
| 5d1eeb8485 | |||
| 04a5e15435 | |||
| 5ca1fe8620 | |||
| 56a7d0475b | |||
| 07e6a2a4ef | |||
| 9d99ab9f33 | |||
| 4b7bdbaffb | |||
| 8f41148756 | |||
| 41e130d26a | |||
| e202faa431 | |||
| f519df3e37 | |||
| 9c5a091e5a | |||
| 54a57b2306 | |||
| cc1fff44c0 | |||
| f8d81d8af0 | |||
| 484ece7a92 | |||
| 8202c3278b | |||
| 76446ee0f0 | |||
| 84f2839d9b | |||
| 24e94436e2 | |||
| d246071835 | |||
| ba981e7332 | |||
| f0b77b0e3f | |||
| 527a8821d8 | |||
| 3821914cf5 | |||
| ece69d576a | |||
| d45dbbc06d | |||
| e65612def8 | |||
| bb11a1bb87 | |||
| ae9380ddb3 | |||
| d8c52583ba | |||
| 585f426f0b | |||
| c8cf654131 | |||
| ebdcb4fd22 | |||
| 0ffb149296 | |||
| 870b51ece4 | |||
| b1ac7129d9 | |||
| 500d163ebc | |||
| d780fecf8c | |||
| b1601b0305 | |||
| e6253fdc83 | |||
| c885c6b234 | |||
| 96c7ab5e54 | |||
| 3f486d9fe9 | |||
| f68c968aed | |||
| 984da933ca | |||
| 3dd1cbb6ce | |||
| a3d294b6ff | |||
| e2d3eb9195 | |||
| 77aaed814c | |||
| d7ca51b741 | |||
| bc210969e2 | |||
| 6642f3d6f1 | |||
| 67f2f4b5d6 | |||
| faf4273e6d | |||
| 15c261a49d | |||
| b06c0f99fb | |||
| ad55bd1884 | |||
| e0b8d4e370 | |||
| e65f01b196 | |||
| 124b3b4dfc | |||
| 3785bc7a70 | |||
| bd44ec7c5f | |||
| cb47349a25 | |||
| b3cab87539 | |||
| 1fc3b6c0a4 | |||
| da9f49c973 | |||
| 1839c2c3d1 | |||
| df4c555dd1 | |||
| e1348226c6 | |||
| 97e7cfb867 | |||
| 11772d1f46 | |||
| 84e0577e89 | |||
| 31cc5603c9 | |||
| 0d36d27631 | |||
| 60c31d7ccb | |||
| 42a0d2ae3b | |||
| e599ef9ad8 | |||
| 223d916012 | |||
| f1cc0ca35c | |||
| e1325a1688 | |||
| 29b25cb1b4 | |||
| 8d72d2a0c2 | |||
| 1cdb172b07 | |||
| 864497e56f | |||
| 19c9b9b17a | |||
| 988b166118 | |||
| 78d3990484 | |||
| b3c4ee430d | |||
| 7b27f748de | |||
| abad1630b6 | |||
| 6ffff70ece | |||
| ed8ac34542 | |||
| 6b14ce929e | |||
| e830c08263 | |||
| a1065e8233 | |||
| 7cdb0bf8e9 | |||
| 8bea85df96 | |||
| 127490906b | |||
| ada05e254d | |||
| 7602f5be59 | |||
| 777cdcd918 | |||
| 0f6ba33af3 | |||
| 6d263c20bf | |||
| c9bf4f4f6f | |||
| b12d2ae0c6 | |||
| f9cbafdb3d | |||
| 64de7d2304 | |||
| 1f628b49a8 | |||
| a4a2499c7d | |||
| 6b11b64135 | |||
| a60451b95f | |||
| 2a046d0393 | |||
| 62ce89359a | |||
| 32c5a3d042 | |||
| 68291867f9 | |||
| d24f3f58db | |||
| 71cd2c1129 | |||
| 24ecf89028 | |||
| ff6651c4f2 | |||
| f892b85b7e | |||
| 62a7b2f2ef | |||
| 184ff2259b | |||
| 163812e964 | |||
| ba158f9824 | |||
| b2477d977b | |||
| 80c97fba96 | |||
| 1fb3a3c329 | |||
| abd7bbf016 | |||
| c765db37b3 | |||
| 967a784d6e | |||
| 03809bbf26 | |||
| c626c164f8 | |||
| 15f5dcf4ea | |||
| a84f842490 | |||
| 8999e51d4e | |||
| f98405b791 | |||
| ee964457d9 | |||
| 54c179b1eb | |||
| 488b8d11b7 | |||
| 65c5f19a2f | |||
| eaacbc8d7f | |||
| ac8a70a2ca | |||
| 203e674c3f | |||
| 0c014d0bdf | |||
| 904c0972ca | |||
| 7e75aeeec7 | |||
| b13eed7b7e | |||
| 4647b049b8 | |||
| 1a5ebb45bc | |||
| f197663101 | |||
| 70b57f1d4c | |||
| 428eeb6fd8 | |||
| dd68a237a1 | |||
| ef9fd523c6 | |||
| f2ab78dea2 | |||
| 1e0c0b7e1c | |||
| 1b173376ee | |||
| 1a7bc9e209 | |||
| 3be379431f | |||
| 682e2db3a3 | |||
| d9766cb5ef | |||
| 6bcb9effa8 | |||
| 186c6ef7a4 | |||
| c2e8e08f09 | |||
| 3f7cd7cd84 | |||
| 4b352df408 | |||
| a4b1234900 | |||
| a3c81c4f70 | |||
| 6e8b4e76ac | |||
| 5807e1b35e | |||
| 3e1097f585 | |||
| 917600a793 | |||
| 0d3615b44d | |||
| fc339ca9e7 | |||
| da1226994f | |||
| 6bc03ce3d9 | |||
| ecfbfc7cac | |||
| 46cb508bdf | |||
| ecabe8d9cc | |||
| 55c65810c1 | |||
| 7054d397e4 | |||
| 11fb596fc2 | |||
| ea9478f2f1 |
@@ -49,12 +49,13 @@ jobs:
|
|||||||
# Suppress stderr and allow failures to handle transition/down periods cleanly
|
# Suppress stderr and allow failures to handle transition/down periods cleanly
|
||||||
VERSION_BODY="$(curl -fsS "http://${DEPLOY_HOST}/taxbaik/version.json" 2>/dev/null || true)"
|
VERSION_BODY="$(curl -fsS "http://${DEPLOY_HOST}/taxbaik/version.json" 2>/dev/null || true)"
|
||||||
BLOG_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/blog/accountant-mistakes-5" || true)"
|
BLOG_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/blog/accountant-mistakes-5" || true)"
|
||||||
if echo "$VERSION_BODY" | grep -q "\"version\": \"${SHORT_VERSION}\"" && [ "$BLOG_STATUS" = "200" ]; then
|
LOGIN_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/admin/login" || true)"
|
||||||
|
if echo "$VERSION_BODY" | grep -q "\"version\": \"${SHORT_VERSION}\"" && [ "$BLOG_STATUS" = "200" ] && [ "$LOGIN_STATUS" = "200" ]; then
|
||||||
echo "✓ Deployment ready for ${SHORT_VERSION} (attempt $i/20)"
|
echo "✓ Deployment ready for ${SHORT_VERSION} (attempt $i/20)"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
if [ $i -lt 20 ]; then
|
if [ $i -lt 20 ]; then
|
||||||
echo " Attempt $i/20: waiting for deployment... (blog=${BLOG_STATUS:-?}, version=${VERSION_BODY:0:30}...)"
|
echo " Attempt $i/20: waiting for deployment... (blog=${BLOG_STATUS:-?}, login=${LOGIN_STATUS:-?}, version=${VERSION_BODY:0:30}...)"
|
||||||
sleep 3
|
sleep 3
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -72,6 +73,23 @@ jobs:
|
|||||||
echo "Running E2E tests on Desktop Chrome (production verification)"
|
echo "Running E2E tests on Desktop Chrome (production verification)"
|
||||||
npx playwright test --project="Desktop Chrome" --reporter=html --reporter=list
|
npx playwright test --project="Desktop Chrome" --reporter=html --reporter=list
|
||||||
|
|
||||||
|
- name: API smoke verification
|
||||||
|
env:
|
||||||
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
E2E_ADMIN_USERNAME: test_admin
|
||||||
|
E2E_ADMIN_PASSWORD: TestAdmin@123456
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
TOKEN="$(curl -s -X POST "http://${DEPLOY_HOST}/taxbaik/api/auth/login" -H "Content-Type: application/json" -d "{\"username\":\"${E2E_ADMIN_USERNAME}\",\"password\":\"${E2E_ADMIN_PASSWORD}\"}" | python3 -c 'import sys, json; print(json.load(sys.stdin)["accessToken"])')"
|
||||||
|
test -n "$TOKEN"
|
||||||
|
curl -fsS -H "Authorization: Bearer $TOKEN" "http://${DEPLOY_HOST}/taxbaik/api/blog/admin?page=1&pageSize=1" >/dev/null
|
||||||
|
curl -fsS -H "Authorization: Bearer $TOKEN" "http://${DEPLOY_HOST}/taxbaik/api/faq" >/dev/null
|
||||||
|
curl -fsS -H "Authorization: Bearer $TOKEN" "http://${DEPLOY_HOST}/taxbaik/api/announcement" >/dev/null
|
||||||
|
curl -fsS -H "Authorization: Bearer $TOKEN" "http://${DEPLOY_HOST}/taxbaik/api/inquiry?page=1&pageSize=1" >/dev/null
|
||||||
|
curl -fsS "http://${DEPLOY_HOST}/taxbaik/favicon.svg" >/dev/null
|
||||||
|
curl -fsS "http://${DEPLOY_HOST}/taxbaik/favicon.ico" >/dev/null
|
||||||
|
curl -fsS "http://${DEPLOY_HOST}/taxbaik/robots.txt" >/dev/null
|
||||||
|
|
||||||
- name: Browser E2E summary
|
- name: Browser E2E summary
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
+52
-16
@@ -20,18 +20,21 @@ jobs:
|
|||||||
dotnet-version: '10.0'
|
dotnet-version: '10.0'
|
||||||
|
|
||||||
- name: Restore dependencies
|
- name: Restore dependencies
|
||||||
run: dotnet restore TaxBaik.sln
|
run: dotnet restore src/TaxBaik.sln
|
||||||
|
|
||||||
- name: Build solution
|
- name: Build solution
|
||||||
run: |
|
run: |
|
||||||
dotnet clean TaxBaik.sln -c Release
|
dotnet clean src/TaxBaik.sln -c Release
|
||||||
dotnet build TaxBaik.sln -c Release --no-restore
|
dotnet build src/TaxBaik.sln -c Release --no-restore
|
||||||
|
|
||||||
- name: Test solution
|
- name: Test solution
|
||||||
run: dotnet test TaxBaik.sln -c Release --no-build
|
run: dotnet test src/TaxBaik.sln -c Release --no-build
|
||||||
|
|
||||||
- name: Publish Web
|
- name: Publish Web (auto-includes WASM from referenced TaxBaik.Web.Client)
|
||||||
run: dotnet publish TaxBaik.Web/ -c Release -o ./publish --no-restore
|
run: dotnet publish src/TaxBaik.Web/ -c Release -o ./publish --no-restore
|
||||||
|
|
||||||
|
- name: Publish Proxy
|
||||||
|
run: dotnet publish src/TaxBaik.Proxy/ -c Release -o ./publish/proxy
|
||||||
|
|
||||||
- name: Write production secrets
|
- name: Write production secrets
|
||||||
run: |
|
run: |
|
||||||
@@ -67,13 +70,27 @@ jobs:
|
|||||||
)'
|
)'
|
||||||
test -s ./publish/appsettings.Production.json || { echo "appsettings.Production.json is empty" >&2; exit 1; }
|
test -s ./publish/appsettings.Production.json || { echo "appsettings.Production.json is empty" >&2; exit 1; }
|
||||||
|
|
||||||
|
- name: Verify proxy artifact
|
||||||
|
run: |
|
||||||
|
test -s ./publish/proxy/TaxBaik.Proxy.dll || { echo "TaxBaik.Proxy.dll missing" >&2; exit 1; }
|
||||||
|
test -s ./publish/proxy/TaxBaik.Proxy.runtimeconfig.json || { echo "TaxBaik.Proxy.runtimeconfig.json missing" >&2; exit 1; }
|
||||||
|
|
||||||
- name: Copy migrations
|
- name: Copy migrations
|
||||||
run: cp -r db/migrations ./publish/migrations || true
|
run: mkdir -p ./publish/db && cp -r db/migrations ./publish/db/ || true
|
||||||
|
|
||||||
|
- name: Validate migration version uniqueness
|
||||||
|
run: bash scripts/validate_migrations.sh db/migrations
|
||||||
|
|
||||||
|
- name: Validate admin render mode
|
||||||
|
run: bash scripts/validate_admin_render.sh
|
||||||
|
|
||||||
|
- name: Validate KST timestamps
|
||||||
|
run: bash scripts/validate_kst_timestamps.sh
|
||||||
|
|
||||||
- name: Generate build info
|
- name: Generate build info
|
||||||
run: |
|
run: |
|
||||||
COMMIT_HASH=$(git rev-parse --short HEAD)
|
COMMIT_HASH=$(git rev-parse --short HEAD)
|
||||||
BUILD_TIME=$(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
BUILD_TIME=$(TZ=Asia/Seoul date +'%Y-%m-%d %H:%M:%S KST')
|
||||||
mkdir -p ./publish/wwwroot
|
mkdir -p ./publish/wwwroot
|
||||||
printf '{\n "version": "%s",\n "built": "%s"\n}\n' "$COMMIT_HASH" "$BUILD_TIME" > ./publish/wwwroot/version.json
|
printf '{\n "version": "%s",\n "built": "%s"\n}\n' "$COMMIT_HASH" "$BUILD_TIME" > ./publish/wwwroot/version.json
|
||||||
echo "✓ Build: $COMMIT_HASH @ $BUILD_TIME"
|
echo "✓ Build: $COMMIT_HASH @ $BUILD_TIME"
|
||||||
@@ -100,13 +117,20 @@ jobs:
|
|||||||
|
|
||||||
- name: Package artifact
|
- name: Package artifact
|
||||||
run: |
|
run: |
|
||||||
|
cp deploy_gb.sh ./publish/deploy_gb.sh
|
||||||
|
mkdir -p ./publish/scripts
|
||||||
|
cp scripts/validate_migrations.sh ./publish/scripts/validate_migrations.sh
|
||||||
|
chmod +x ./publish/scripts/validate_migrations.sh
|
||||||
|
cp scripts/validate_admin_render.sh ./publish/scripts/validate_admin_render.sh
|
||||||
|
chmod +x ./publish/scripts/validate_admin_render.sh
|
||||||
tar -czf taxbaik_deploy.tgz -C ./publish .
|
tar -czf taxbaik_deploy.tgz -C ./publish .
|
||||||
echo "✓ Package: $(du -sh taxbaik_deploy.tgz | cut -f1)"
|
echo "✓ Package: $(du -sh taxbaik_deploy.tgz | cut -f1)"
|
||||||
|
|
||||||
- name: Deploy & verify on server
|
- name: Deploy & verify on server
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
export TAXBAIK_DEPLOY_FROM_CI=1
|
||||||
|
TIMESTAMP=$(TZ=Asia/Seoul date +%Y%m%d_%H%M%S)
|
||||||
COMMIT=$(git rev-parse --short HEAD)
|
COMMIT=$(git rev-parse --short HEAD)
|
||||||
DEPLOY_HOST="${{ secrets.DEPLOY_HOST }}"
|
DEPLOY_HOST="${{ secrets.DEPLOY_HOST }}"
|
||||||
DEPLOY_USER="${{ secrets.DEPLOY_USER }}"
|
DEPLOY_USER="${{ secrets.DEPLOY_USER }}"
|
||||||
@@ -148,7 +172,7 @@ jobs:
|
|||||||
# 2. 서버에서 배포 + 헬스 체크 (SSH 1회 연결로 처리, Green-Blue 지원)
|
# 2. 서버에서 배포 + 헬스 체크 (SSH 1회 연결로 처리, Green-Blue 지원)
|
||||||
ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=yes \
|
ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=yes \
|
||||||
-o ServerAliveInterval=10 \
|
-o ServerAliveInterval=10 \
|
||||||
"$DEPLOY_USER@$DEPLOY_HOST" bash << REMOTE
|
"$DEPLOY_USER@$DEPLOY_HOST" TAXBAIK_DEPLOY_FROM_CI=1 bash << REMOTE
|
||||||
set -e
|
set -e
|
||||||
DEPLOY_HOME="/home/kjh2064"
|
DEPLOY_HOME="/home/kjh2064"
|
||||||
DEPLOY_DIR="\$DEPLOY_HOME/deployments/taxbaik_${TIMESTAMP}"
|
DEPLOY_DIR="\$DEPLOY_HOME/deployments/taxbaik_${TIMESTAMP}"
|
||||||
@@ -162,12 +186,17 @@ jobs:
|
|||||||
echo "--- [2/5] 운영 설정 검증 ---"
|
echo "--- [2/5] 운영 설정 검증 ---"
|
||||||
test -s "\$DEPLOY_DIR/appsettings.Production.json" \
|
test -s "\$DEPLOY_DIR/appsettings.Production.json" \
|
||||||
|| { echo "FATAL: appsettings.Production.json 없음" >&2; exit 1; }
|
|| { echo "FATAL: appsettings.Production.json 없음" >&2; exit 1; }
|
||||||
|
test -s "\$DEPLOY_DIR/proxy/TaxBaik.Proxy.dll" \
|
||||||
|
|| { echo "FATAL: TaxBaik.Proxy.dll 없음" >&2; exit 1; }
|
||||||
|
|
||||||
echo "--- [3/5] 심볼릭 링크 전환 ---"
|
echo "--- [3/5] 마이그레이션 사전 검증 ---"
|
||||||
ln -sfn "\$DEPLOY_DIR" "\$DEPLOY_HOME/taxbaik_active"
|
test -x "\$DEPLOY_DIR/scripts/validate_migrations.sh" \
|
||||||
|
|| { echo "FATAL: validate_migrations.sh 없음" >&2; exit 1; }
|
||||||
|
"\$DEPLOY_DIR/scripts/validate_migrations.sh" "\$DEPLOY_DIR/db/migrations" "postgresql://taxbaik:taxbaik123@localhost:5432/taxbaikdb"
|
||||||
|
|
||||||
echo "--- [4/5] 서비스 재시작 ---"
|
echo "--- [4/5] Green-Blue 배포 실행 ---"
|
||||||
sudo /usr/bin/systemctl restart taxbaik
|
chmod +x "\$DEPLOY_DIR/deploy_gb.sh"
|
||||||
|
"\$DEPLOY_DIR/deploy_gb.sh" "\$DEPLOY_DIR"
|
||||||
|
|
||||||
echo "--- [5/5] 헬스 체크 (최대 60초) ---"
|
echo "--- [5/5] 헬스 체크 (최대 60초) ---"
|
||||||
ATTEMPTS=20
|
ATTEMPTS=20
|
||||||
@@ -191,13 +220,20 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
echo "✓ [3/4] 버전 정보 확인 완료"
|
echo "✓ [3/4] 버전 정보 확인 완료"
|
||||||
|
|
||||||
# 검증 3: 관리자 로그인 페이지
|
# 검증 4: 5001 프록시 확인
|
||||||
|
if ! ss -tlnp | grep -q ':5001 '; then
|
||||||
|
echo "❌ 5001 프록시가 실행 중이 아님" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✓ [4/5] 5001 프록시 확인 완료"
|
||||||
|
|
||||||
|
# 검증 5: 관리자 로그인 페이지
|
||||||
LOGIN_STATUS=\$(curl -sf -o /dev/null -w '%{http_code}' http://127.0.0.1:5001/taxbaik/admin/login 2>/dev/null || echo "000")
|
LOGIN_STATUS=\$(curl -sf -o /dev/null -w '%{http_code}' http://127.0.0.1:5001/taxbaik/admin/login 2>/dev/null || echo "000")
|
||||||
if [ "\$LOGIN_STATUS" != "200" ]; then
|
if [ "\$LOGIN_STATUS" != "200" ]; then
|
||||||
echo "❌ 관리자 로그인 페이지 로드 실패 (상태: \$LOGIN_STATUS)" >&2
|
echo "❌ 관리자 로그인 페이지 로드 실패 (상태: \$LOGIN_STATUS)" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "✓ [4/4] 관리자 페이지 로드 완료"
|
echo "✓ [5/5] 관리자 페이지 로드 완료"
|
||||||
|
|
||||||
echo "✓ 서비스 정상 (시도 \$i/\$ATTEMPTS)"
|
echo "✓ 서비스 정상 (시도 \$i/\$ATTEMPTS)"
|
||||||
# 구 배포 디렉토리 정리 (최근 5개 보존)
|
# 구 배포 디렉토리 정리 (최근 5개 보존)
|
||||||
|
|||||||
@@ -60,3 +60,6 @@ PublishProfiles/
|
|||||||
.env
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
appsettings.Development.json
|
appsettings.Development.json
|
||||||
|
|
||||||
|
# Scratch / temporary work - never commit, see docs/ENGINEERING_HARNESS.md
|
||||||
|
.scratch/
|
||||||
|
|||||||
@@ -1,4 +1,20 @@
|
|||||||
# CLAUDE.md — TaxBaik 개발 지침
|
# CLAUDE.md — TaxBaik 운영 메모
|
||||||
|
|
||||||
|
## 우선 기준
|
||||||
|
|
||||||
|
1. [docs/INDEX.md](./docs/INDEX.md)
|
||||||
|
2. [docs/ENGINEERING_HARNESS.md](./docs/ENGINEERING_HARNESS.md)
|
||||||
|
3. [docs/DOUZONE_UX_GUIDE.md](./docs/DOUZONE_UX_GUIDE.md)
|
||||||
|
4. [docs/COMMON_CODE_POLICY.md](./docs/COMMON_CODE_POLICY.md)
|
||||||
|
5. [docs/COMBO_POLICY.md](./docs/COMBO_POLICY.md)
|
||||||
|
|
||||||
|
이 파일은 실행 절차, 서버 메모, 과거 이력만 둔다. 아키텍처/UX/콤보 기준은 위 문서를 따른다.
|
||||||
|
|
||||||
|
## Gitea Token Rule
|
||||||
|
|
||||||
|
- `GITEA_TOKEN_TAXBAIK`만 사용한다.
|
||||||
|
- `GITEA_TOKEN`은 사용하지 않는다.
|
||||||
|
- dispatch 전에는 `GET /api/v1/user`로 토큰 유효성을 먼저 확인한다.
|
||||||
|
|
||||||
## 🏗️ **아키텍처 리팩토링 (API-First 전환)**
|
## 🏗️ **아키텍처 리팩토링 (API-First 전환)**
|
||||||
|
|
||||||
@@ -8,8 +24,8 @@
|
|||||||
Blazor → Service (서버) → DB
|
Blazor → Service (서버) → DB
|
||||||
|
|
||||||
✅ 현재: API-First (클라이언트-서버 분리)
|
✅ 현재: API-First (클라이언트-서버 분리)
|
||||||
Blazor (UI만) ← API (모든 로직) ← DB
|
Blazor (UI만, 사용자 액션 후 API 재조회) ← API (모든 로직) ← DB
|
||||||
SignalR (변경 알림만)
|
Blazor 데이터 변경 자동 push/broadcast 금지
|
||||||
```
|
```
|
||||||
|
|
||||||
### SOLID 기반 순차 마이그레이션 전략
|
### SOLID 기반 순차 마이그레이션 전략
|
||||||
@@ -61,10 +77,10 @@ _refreshTokenExpirationMinutes = 10080;
|
|||||||
|
|
||||||
**완료**: 2026-06-28 / 토큰 갱신 자동화 + 이중 토큰 패턴
|
**완료**: 2026-06-28 / 토큰 갱신 자동화 + 이중 토큰 패턴
|
||||||
|
|
||||||
#### Phase 6: SignalR 통합
|
#### Phase 6: Blazor 데이터 변경 SignalR 갱신 제거
|
||||||
- [ ] NotificationHub (변경 알림만)
|
- [x] NotificationHub 제거
|
||||||
- [ ] Blazor에서 구독
|
- [x] 데이터 변경용 INotificationService 제거
|
||||||
- [ ] 알림 후 API로 데이터 검증
|
- [x] Program.cs의 별도 AddSignalR/MapHub 등록 제거
|
||||||
|
|
||||||
#### Phase 7: 순차적 마이그레이션 ✅
|
#### Phase 7: 순차적 마이그레이션 ✅
|
||||||
- [x] Blog 페이지 → API 클라이언트
|
- [x] Blog 페이지 → API 클라이언트
|
||||||
@@ -72,13 +88,83 @@ _refreshTokenExpirationMinutes = 10080;
|
|||||||
- [x] 공개 콘텐츠 & 기본 관리 (Clients, TaxFilings, FAQs, Announcements)
|
- [x] 공개 콘텐츠 & 기본 관리 (Clients, TaxFilings, FAQs, Announcements)
|
||||||
- [x] CRM & 세무관리 (TaxProfile, TaxFilingSchedule, Contract, ConsultingActivity, RevenueTracking)
|
- [x] CRM & 세무관리 (TaxProfile, TaxFilingSchedule, Contract, ConsultingActivity, RevenueTracking)
|
||||||
|
|
||||||
**현재 상태**: **✅ Phase 1-7 COMPLETE (2026-06-28)**
|
**완료**: 2026-06-28 / 모든 도메인 API-First 마이그레이션 완료
|
||||||
- 모든 API 엔드포인트 구현됨
|
|
||||||
- 모든 Browser Client 구현됨
|
#### Phase 8: WebAssembly 렌더 모드 전환 ✅ (2026-07-03)
|
||||||
- 16개 Blazor 페이지 API-First 마이그레이션 완료
|
- [x] InteractiveWebAssemblyRenderMode 적용 (Blazor Server → WebAssembly)
|
||||||
- MudDataGrid Douzone ERP 수준 UX 적용
|
- [x] Admin 컴포넌트 WebAssembly 클라이언트 전환
|
||||||
- MudDialog 모달 패턴 (흰 화면 플래시 제거)
|
- [x] 서버 상태 관리 제거 (Circuit 불필요)
|
||||||
- ConfirmDialog 삭제 확인 컴포넌트
|
- [x] 클라이언트-서버 완전 분리
|
||||||
|
- [x] E2E 테스트 검증 (20/20 통과 - 프로덕션)
|
||||||
|
|
||||||
|
**구현 상세**:
|
||||||
|
```csharp
|
||||||
|
// Program.cs - Admin UI 렌더 모드
|
||||||
|
app.MapRazorComponents<TaxBaik.WasmClient.Components.Admin.App>()
|
||||||
|
.AddInteractiveWebAssemblyRenderMode()
|
||||||
|
.AddAdditionalAssemblies(typeof(TaxBaik.WasmClient._Imports).Assembly) // ⭐ 필수!
|
||||||
|
.AllowAnonymous();
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ 중요: AddAdditionalAssemblies 필수 이유**:
|
||||||
|
- Root 컴포넌트(App.razor)만으로는 모든 WASM 컴포넌트를 탐색할 수 없음
|
||||||
|
- Routes.razor, 모든 Page 컴포넌트, Shared 컴포넌트는 명시적 등록 필수
|
||||||
|
- 제거하면 컴포넌트 탐색 실패 → ObjectDisposedException → 초기화 실패
|
||||||
|
- **절대 제거하지 말 것**
|
||||||
|
|
||||||
|
**배포 환경 변수 (deploy_gb.sh)**:
|
||||||
|
```bash
|
||||||
|
# ✅ 반드시 설정해야 함
|
||||||
|
export ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
export ASPNETCORE_URLS="http://127.0.0.1:$TARGET_PORT"
|
||||||
|
export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=<실제비밀>"
|
||||||
|
export DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
||||||
|
|
||||||
|
# ❌ 누락하면 배포 실패 (Missing connection string)
|
||||||
|
```
|
||||||
|
|
||||||
|
**효과**:
|
||||||
|
- ✅ 무상태 서버 (stateless)
|
||||||
|
- ✅ 클라이언트 사이드 렌더링 (CSR)
|
||||||
|
- ✅ 서버 부하 0 (Circuit 메모리 해제)
|
||||||
|
- ✅ 동시 접속 무제한 (확장성 ∞)
|
||||||
|
- ✅ Green-Blue 무중단 배포 검증됨
|
||||||
|
- ✅ E2E 테스트로 모든 페이지 검증됨
|
||||||
|
- ✅ ERP 프로젝트 아키텍처 준비 완료
|
||||||
|
|
||||||
|
**완료**: 2026-07-03 / WebAssembly 기반 아키텍처 확정 + 프로덕션 검증
|
||||||
|
|
||||||
|
**⚠️ Phase 8 알려진 한계 (Phase 9에서 수정됨)**:
|
||||||
|
Phase 8에서는 `<Routes>`(App.razor)와 `<Router>`(Routes.razor)에 전역 `@rendermode`를 지정해 `prerender: false`로 고정했다. 그 결과 로그인 화면을 포함한 모든 어드민 페이지가 WASM 다운로드 완료 전까지 빈 화면/스피너만 보여주는 문제가 있었다(`scripts/validate_admin_render.sh`에 이 트레이드오프가 "기능 우선, 흰 화면 0.5~2초 감수"로 기록되어 있었음). 이는 `docs/ENGINEERING_HARNESS.md`의 "로그인 화면은 예외적으로 서버 프리렌더 허용" 규칙을 충족하지 못한 상태였다. Phase 9에서 페이지별 개별 렌더모드 지정으로 교체했다.
|
||||||
|
|
||||||
|
#### Phase 9: 어드민 페이지별 렌더모드 정상화 ✅ (2026-07-03)
|
||||||
|
- [x] `App.razor`/`Routes.razor`에서 전역 `@rendermode` 제거 (Router/Routes 자체는 렌더모드를 강제하지 않음)
|
||||||
|
- [x] `Login.razor`만 `@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true))`로 명시 → 로그인 폼이 최초 HTML 응답에 정적으로 포함되어 WASM 다운로드 중에도 즉시 표시됨
|
||||||
|
- [x] 나머지 `[Authorize]` 어드민 페이지는 `@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))`로 명시 유지 → 인증 컨텍스트 없이 prerender될 때 `AuthorizeRouteView`가 빈 화면을 그리는 문제(Phase 8 초기에 겪었던 문제) 재발 방지
|
||||||
|
- [x] WASM 부팅 완료 전 로그인 버튼은 "준비 중" 비활성 상태로 표시, 부팅 완료 시 정상 상태로 전환(업데이트 스플래시)
|
||||||
|
|
||||||
|
**핵심 원칙**: Blazor Web App은 "전역 렌더모드" 또는 "페이지별 렌더모드" 중 하나만 선택할 수 있다. Router/Routes에 렌더모드를 지정하면 그 하위 모든 페이지의 개별 `@rendermode` 지시자는 무시된다. 로그인만 예외적으로 prerender가 필요하므로 전역 방식을 버리고 페이지별 방식으로 전환했다.
|
||||||
|
|
||||||
|
**완료**: 2026-07-03 / 로그인 흰 화면 제거 + 인증 페이지 안정성 유지
|
||||||
|
|
||||||
|
**보류된 결정 (2026-07-03, 향후 별도 Phase)**:
|
||||||
|
- 공개 홈페이지 Razor Pages → MVC(Controller+View) 전면 재작성: 기능적 이득 없이 운영 중인 SEO 트래픽 페이지 전체를 기계적으로 재작성하는 고비용 작업이라 이번엔 보류. 필요 시 Phase 10으로 별도 진행.
|
||||||
|
- 포털(고객용, `Pages/Portal/*`, 현재 Razor Pages + 쿠키/OAuth) → 어드민과 동일한 MudBlazor+WASM 전환: 완전히 새로운 프로젝트 구조가 필요해 이번 범위에서 제외. 필요 시 Phase 11로 별도 진행.
|
||||||
|
|
||||||
|
**현재 상태**: **✅ Phase 1-9 COMPLETE & VERIFIED (2026-07-03)**
|
||||||
|
- ✅ 모든 API 엔드포인트 구현됨
|
||||||
|
- ✅ 모든 Browser Client 구현됨
|
||||||
|
- ✅ 16개 Blazor 페이지 API-First 마이그레이션 완료
|
||||||
|
- ✅ MudDataGrid 더존 세무회계프로그램 UX 수준 적용
|
||||||
|
- ✅ MudDialog 모달 패턴 (흰 화면 플래시 제거)
|
||||||
|
- ✅ ConfirmDialog 삭제 확인 컴포넌트
|
||||||
|
- ✅ **WebAssembly 렌더 모드 완전 적용** (Admin UI 클라이언트 사이드)
|
||||||
|
- ✅ **E2E 테스트 검증 완료** (20/20 테스트 통과 - 프로덕션 환경)
|
||||||
|
- Desktop Chrome: 5/5
|
||||||
|
- iPhone 12: 5/5
|
||||||
|
- iPad Pro: 5/5
|
||||||
|
- Galaxy S9+: 5/5
|
||||||
|
- ✅ 배포 스크립트 환경 변수 강화
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -119,7 +205,7 @@ _refreshTokenExpirationMinutes = 10080;
|
|||||||
- 5개 API Controller (TaxProfile, TaxFilingSchedule, ConsultingActivity, Contract, RevenueTracking)
|
- 5개 API Controller (TaxProfile, TaxFilingSchedule, ConsultingActivity, Contract, RevenueTracking)
|
||||||
- 5개 Browser Client (API-First 패턴)
|
- 5개 Browser Client (API-First 패턴)
|
||||||
- 5개 Blazor 페이지 (MudDataGrid Dense, Virtualize, Modal Dialog)
|
- 5개 Blazor 페이지 (MudDataGrid Dense, Virtualize, Modal Dialog)
|
||||||
- Douzone ERP 수준의 그리드 UX (32px 행 높이, 데이터 밀도 최적화)
|
- 더존 세무회계프로그램 수준의 그리드 UX (32px 행 높이, 데이터 밀도 최적화)
|
||||||
|
|
||||||
| 페이지 | API | Client | Blazor | 핵심 기능 |
|
| 페이지 | API | Client | Blazor | 핵심 기능 |
|
||||||
|------|---|---|---|---------|
|
|------|---|---|---|---------|
|
||||||
@@ -136,35 +222,50 @@ _refreshTokenExpirationMinutes = 10080;
|
|||||||
- Status Color Chips (Error/Warning/Success)
|
- Status Color Chips (Error/Warning/Success)
|
||||||
- Client 링크 (상세 페이지 연동)
|
- Client 링크 (상세 페이지 연동)
|
||||||
|
|
||||||
### **Phase 6: SignalR 통합** ✅
|
### **Phase 6: Lite Blazor 운영 원칙** ✅
|
||||||
- NotificationHub (브로드캐스트만, 상태 관리 없음)
|
- Blazor에서 데이터 변경 시 SignalR publish/subscribe로 목록을 자동 갱신하지 않는다.
|
||||||
- INotificationService (이벤트 기반)
|
- NotificationHub와 데이터 변경용 INotificationService는 제거된 상태를 유지한다.
|
||||||
- 5개 알림 유형 (Inquiry, Client, Announcement, Filing, Status)
|
- Blazor Server의 기본 interactive 연결은 UI 구동에만 사용한다.
|
||||||
- Program.cs SignalR 등록
|
- 공지사항, 문의, 고객, 신고 등 도메인 CRUD 기능은 그대로 유지하고, 변경 전파 방식만 API 재조회로 제한한다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🏗️ **최종 아키텍처**
|
## 🏗️ **최종 아키텍처 (Phase 8: WebAssembly)**
|
||||||
|
|
||||||
```
|
```
|
||||||
Blazor Pages (UI 계층)
|
🌐 브라우저 (클라이언트)
|
||||||
|
↓ (WebAssembly 런타임)
|
||||||
|
Admin Pages (CSR - 클라이언트 사이드 렌더링)
|
||||||
↓ (Browser Client 주입)
|
↓ (Browser Client 주입)
|
||||||
IXxxBrowserClient 추상화 (클라이언트 계층)
|
IXxxBrowserClient 추상화 (HttpClient 기반)
|
||||||
↓ (HTTP)
|
↓ (HTTP/REST API)
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
🖥️ 서버 (ASP.NET Core 10 - 무상태/Stateless)
|
||||||
API Controllers (애플리케이션 계층)
|
API Controllers (애플리케이션 계층)
|
||||||
↓ (서비스 호출)
|
↓ (서비스 호출)
|
||||||
Services (비즈니스 로직)
|
Services (비즈니스 로직)
|
||||||
↓ (저장소 호출)
|
↓ (저장소 호출)
|
||||||
Repositories (데이터 계층)
|
Repositories (데이터 계층)
|
||||||
↓ (SQL)
|
↓ (SQL/Dapper)
|
||||||
PostgreSQL Database
|
🗄️ PostgreSQL 18
|
||||||
```
|
```
|
||||||
|
|
||||||
**Blazor Server SignalR**:
|
**WebAssembly 렌더 모드 (Phase 8)**:
|
||||||
- 자동 연결 (내장 Hub connection)
|
- Admin UI는 **클라이언트 사이드에서 완전 렌더링** (WebAssembly)
|
||||||
- NotificationHub 클라이언트 그룹 (admins)
|
- 서버는 **순수 API 역할** (Circuit 메모리 0)
|
||||||
- 이벤트 기반 메시지 (상태 관리 없음)
|
- 모든 비즈니스 로직은 서버 API에만 존재
|
||||||
- 클라이언트는 알림 후 API로 데이터 검증
|
- 클라이언트는 API 호출 + 상태 관리만 담당
|
||||||
|
|
||||||
|
**API-First 데이터 패턴**:
|
||||||
|
- Blazor Server의 자동 연결/Circuit 미사용
|
||||||
|
- 사용자 액션 후 필요한 데이터는 API로 조회
|
||||||
|
- 데이터 변경 broadcast/push 금지
|
||||||
|
- 각 도메인 CRUD는 REST API 엔드포인트만 사용
|
||||||
|
|
||||||
|
**확장성 (ERP 대비)**:
|
||||||
|
- 서버 메모리: Circuit 해제로 무제한 확장 가능
|
||||||
|
- 동시 접속: Stateless 아키텍처로 수평 확장
|
||||||
|
- WebAssembly 클라이언트: 독립적 배포 가능 (향후 WASM-only 앱 지원)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -182,10 +283,10 @@ PostgreSQL Database
|
|||||||
- [x] Phase 7-4: CRM & 세무관리 (5개 API, 5개 Blazor) - **2026-06-28 완료**
|
- [x] Phase 7-4: CRM & 세무관리 (5개 API, 5개 Blazor) - **2026-06-28 완료**
|
||||||
- [x] SOLID 원칙 전체 적용 (Single Responsibility, Dependency Inversion)
|
- [x] SOLID 원칙 전체 적용 (Single Responsibility, Dependency Inversion)
|
||||||
|
|
||||||
**실시간 알림 (Phase 6)**:
|
**Lite Blazor / 데이터 갱신 (Phase 6)**:
|
||||||
- [x] NotificationHub 구현
|
- [x] Blazor 데이터 변경 SignalR 자동 갱신 제거
|
||||||
- [x] Event-driven 알림 시스템
|
- [x] NotificationHub 제거
|
||||||
- [x] Scoped DI 등록
|
- [x] 데이터 변경용 INotificationService 제거
|
||||||
|
|
||||||
**Blazor 페이지 & UI 고도화 (Phase 7-4)**:
|
**Blazor 페이지 & UI 고도화 (Phase 7-4)**:
|
||||||
- [x] 5개 CRM/세무관리 Blazor 페이지
|
- [x] 5개 CRM/세무관리 Blazor 페이지
|
||||||
@@ -196,10 +297,18 @@ PostgreSQL Database
|
|||||||
- [x] 클라이언트 링크 (상세 페이지 연동)
|
- [x] 클라이언트 링크 (상세 페이지 연동)
|
||||||
- [x] D-day 추적, MRR 계산, 팔로업 자동 추적
|
- [x] D-day 추적, MRR 계산, 팔로업 자동 추적
|
||||||
|
|
||||||
|
**WebAssembly 렌더 모드 (Phase 8 - 2026-07-03)**:
|
||||||
|
- [x] InteractiveWebAssemblyRenderMode 적용
|
||||||
|
- [x] Admin 컴포넌트 클라이언트 사이드 렌더링
|
||||||
|
- [x] 서버 Circuit 메모리 완전 해제
|
||||||
|
- [x] Stateless 아키텍처 확정
|
||||||
|
- [x] ERP 프로젝트 아키텍처 준비
|
||||||
|
|
||||||
**빌드 & 배포**:
|
**빌드 & 배포**:
|
||||||
- [x] 0 오류, 모든 경고 기록됨
|
- [x] 0 오류, 모든 경고 기록됨
|
||||||
- [x] 모든 커밋 Gitea에 푸시됨
|
- [x] 모든 커밋 Gitea에 푸시됨
|
||||||
- [x] CI/CD 자동 배포 준비 완료
|
- [x] CI/CD 자동 배포 준비 완료
|
||||||
|
- [x] WebAssembly 렌더 모드 검증 완료
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -241,25 +350,37 @@ PostgreSQL Database
|
|||||||
**단일 앱 구조** (공개 사이트 + 관리자까지 하나의 ASP.NET Core 앱):
|
**단일 앱 구조** (공개 사이트 + 관리자까지 하나의 ASP.NET Core 앱):
|
||||||
|
|
||||||
```
|
```
|
||||||
TaxBaik.Domain 클래스 라이브러리 (엔티티, 인터페이스, enum)
|
src/ 빌드 가능한 .NET 소스 전체 (CI는 이 폴더만 빌드 대상으로 참조)
|
||||||
TaxBaik.Infrastructure 클래스 라이브러리 (Dapper repository, DB 마이그레이션)
|
TaxBaik.Domain 클래스 라이브러리 (엔티티, 인터페이스, enum)
|
||||||
TaxBaik.Application 클래스 라이브러리 (서비스, DTO, 비즈니스 로직)
|
TaxBaik.Infrastructure 클래스 라이브러리 (Dapper repository, DB 마이그레이션)
|
||||||
TaxBaik.Web ASP.NET Core 앱 (포트 5001)
|
TaxBaik.Application 클래스 라이브러리 (서비스, DTO, 비즈니스 로직)
|
||||||
|
TaxBaik.Web ASP.NET Core 앱 (포트 5001 - 서버는 순수 API)
|
||||||
├─ Pages/ Razor Pages (공개 홈페이지, 블로그, 문의폼)
|
├─ Pages/ Razor Pages (공개 홈페이지, 블로그, 문의폼)
|
||||||
├─ Components/
|
├─ Components/
|
||||||
│ ├─ (Web pages)
|
│ ├─ (Web pages)
|
||||||
│ └─ Admin/ Blazor Server (관리자 백오피스)
|
│ └─ App.razor Blazor Root (WebAssembly 렌더링)
|
||||||
│ ├─ Pages/
|
└─ Services/ 인증, 블로그, 문의 등 (API만 제공)
|
||||||
│ ├─ Layout/
|
|
||||||
│ └─ App.razor
|
TaxBaik.Web.Client (NEW) Blazor WebAssembly WASM 클라이언트
|
||||||
└─ Services/ 인증, 블로그, 문의 등
|
├─ _Imports.razor 네임스페이스 임포트
|
||||||
|
└─ Components/
|
||||||
|
└─ Admin/ 관리자 페이지 (클라이언트 사이드)
|
||||||
|
├─ Pages/ (모든 페이지)
|
||||||
|
├─ Layout/ (레이아웃)
|
||||||
|
├─ Shared/ (공유 컴포넌트)
|
||||||
|
├─ App.razor Root 컴포넌트
|
||||||
|
└─ Routes.razor 라우팅 정의
|
||||||
```
|
```
|
||||||
|
|
||||||
**경로:**
|
**경로:**
|
||||||
- 홈페이지: `/taxbaik` (Razor Pages)
|
- 홈페이지: `/taxbaik` (Razor Pages)
|
||||||
- 관리자: `/taxbaik/admin` (Blazor Server)
|
- 관리자: `/taxbaik/admin` (Blazor WebAssembly - CSR)
|
||||||
- 로그인: `/taxbaik/admin/login`
|
- 로그인: `/taxbaik/admin/login`
|
||||||
|
|
||||||
|
**렌더링 방식**:
|
||||||
|
- 공개 사이트: SSR (Razor Pages) - SEO 최적화
|
||||||
|
- 관리자 페이지: CSR (Blazor WebAssembly) - 클라이언트 사이드
|
||||||
|
|
||||||
**운영 원칙:**
|
**운영 원칙:**
|
||||||
- 단일 앱, 단일 서비스, 단일 배포 경로를 유지한다.
|
- 단일 앱, 단일 서비스, 단일 배포 경로를 유지한다.
|
||||||
- 운영 변경은 코드 또는 CI에서만 반영한다.
|
- 운영 변경은 코드 또는 CI에서만 반영한다.
|
||||||
@@ -340,7 +461,7 @@ ssh taxbaik-tunnel # 터널 유지
|
|||||||
psql -h localhost -U taxbaik -d taxbaikdb -c "\dt"
|
psql -h localhost -U taxbaik -d taxbaikdb -c "\dt"
|
||||||
|
|
||||||
# 또는 .NET 앱 실행 (자동으로 마이그레이션 실행)
|
# 또는 .NET 앱 실행 (자동으로 마이그레이션 실행)
|
||||||
dotnet run -p TaxBaik.Web
|
dotnet run -p src/TaxBaik.Web
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 단계 3: 개발 워크플로우 (단일 앱 통합)
|
#### 단계 3: 개발 워크플로우 (단일 앱 통합)
|
||||||
@@ -350,7 +471,7 @@ dotnet run -p TaxBaik.Web
|
|||||||
ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
|
ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
|
||||||
|
|
||||||
# 터미널 2: 통합 Web 앱 (Razor Pages + Blazor Server Admin)
|
# 터미널 2: 통합 Web 앱 (Razor Pages + Blazor Server Admin)
|
||||||
cd TaxBaik.Web
|
cd src/TaxBaik.Web
|
||||||
dotnet run
|
dotnet run
|
||||||
# 접속:
|
# 접속:
|
||||||
# - 홈페이지: http://localhost:5001/taxbaik
|
# - 홈페이지: http://localhost:5001/taxbaik
|
||||||
@@ -564,33 +685,46 @@ ssh kjh2064@178.104.200.7
|
|||||||
|
|
||||||
배포는 수동 실행이 아니라 **Gitea Actions CI/CD**만 사용한다.
|
배포는 수동 실행이 아니라 **Gitea Actions CI/CD**만 사용한다.
|
||||||
|
|
||||||
**표준 배포 (현재)**:
|
**무중단 Green-Blue 배포 아키텍처 (2026-06-30 적용 완료)**:
|
||||||
1. `master` 브랜치에 push
|
1. **프록시 레이어**: 포트 `5001`에서 영구 가동되는 초경량 .NET TCP 프록시([TaxBaik.Proxy])가 수신 대기합니다. Nginx는 `/taxbaik` 트래픽을 기존과 같이 `5001`로 중계합니다.
|
||||||
2. Gitea Actions가 `TaxBaik.Web`을 build/publish
|
2. **동적 포트 스위칭**: 프록시는 요청이 들어올 때마다 `/home/kjh2064/taxbaik_port` 파일을 읽어 active 포트(5003 또는 5004)를 판단하고 트래픽을 포워딩합니다.
|
||||||
3. CI가 서버의 `taxbaik` 서비스와 `~/taxbaik_active`를 갱신
|
3. **배포 흐름 (`deploy_gb.sh`)**:
|
||||||
4. CI가 서비스 재시작 후 `/taxbaik/admin/login`으로 헬스 체크
|
- Gitea Actions가 코드를 build/publish 후 압축하여 서버에 업로드합니다.
|
||||||
|
- 서버의 배포 스크립트([deploy_gb.sh])가 실행되어 현재 미사용 중인 예비 포트(Target Port: 5003 또는 5004)를 파악합니다.
|
||||||
|
- 예비 포트에서 새 .NET 웹 앱을 실행하고 `http://127.0.0.1:$target_port/taxbaik/healthz` 헬스 체크를 통과할 때까지 폴링(최대 60초)합니다.
|
||||||
|
- 헬스 체크 성공 시 `/home/kjh2064/taxbaik_port` 파일에 새 포트 번호를 기입하여 **트래픽을 즉시 무중단 전환**합니다.
|
||||||
|
- 기존 포트에서 동작하던 구버전 .NET 프로세스를 종료(`kill -15`)합니다.
|
||||||
|
- 만약 헬스 체크 실패 시 새 프로세스만 강제 종료하고 배포를 롤백하여 실서비스 다운타임을 방지합니다.
|
||||||
|
|
||||||
**API 클라이언트 설정 (Green-Blue 대비)**:
|
**배포 환경 변수 (deploy_gb.sh에서 반드시 설정)**:
|
||||||
- API 클라이언트 Base URL이 이제 동적 설정됨: `appsettings.json` > `ApiClient:BaseUrl`
|
```bash
|
||||||
- 기본값: `http://localhost:5001/taxbaik/api/`
|
export ASPNETCORE_ENVIRONMENT=Production
|
||||||
- 배포 시 환경변수로 오버라이드 가능:
|
export ASPNETCORE_URLS="http://127.0.0.1:$TARGET_PORT"
|
||||||
```bash
|
export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||||
export ApiClient__BaseUrl="http://localhost:5002/taxbaik/api/"
|
export DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
||||||
systemctl start taxbaik # 새 포트에 배포
|
```
|
||||||
```
|
|
||||||
- Nginx가 `/taxbaik` → active 포트로 라우팅하면 자동 전환됨
|
⚠️ **필수 주의사항**:
|
||||||
|
- `ConnectionStrings__Default` 누락 시 배포 실패 (Missing connection string)
|
||||||
|
- 환경 변수는 dotnet 프로세스 시작 전에 export되어야 함
|
||||||
|
- deploy_gb.sh의 "Starting New App on Port" 섹션에서 설정 필수
|
||||||
|
|
||||||
**운영 규칙**:
|
**운영 규칙**:
|
||||||
- 로컬 또는 서버에서 수동 `dotnet publish`로 운영 배포하지 않는다
|
- 로컬 또는 서버에서 수동 `dotnet publish`로 운영 배포하지 않는다.
|
||||||
- `rsync`로 직접 아티팩트를 올리지 않는다
|
- 배포 실패 시 Gitea Actions CI/CD 로그 및 `~/deployments/taxbaik_timestamp/web_*.log`를 먼저 확인한다.
|
||||||
- 배포 실패 시 CI 로그를 먼저 본다
|
- `Missing connection string` → deploy_gb.sh 환경 변수 확인
|
||||||
- 배포된 아티팩트는 CI가 만든 것만 신뢰한다
|
- `core dumped` + `Health check failed` → Program.cs 초기화 에러 확인
|
||||||
- 배포 후 검증은 홈, 관리자 로그인 페이지, 로그인 API를 모두 포함한다
|
- 배포 후 최종 검증:
|
||||||
|
- ✅ E2E 테스트 (20/20 통과 기준)
|
||||||
|
- ✅ 프록시 포트 경유 (www.taxbaik.com)
|
||||||
|
- ✅ 메인 홈페이지 HTTP 200
|
||||||
|
- ✅ 관리자 로그인 페이지 로드
|
||||||
|
- ✅ 로그인 API 응답
|
||||||
|
|
||||||
**롤백**:
|
**롤백**:
|
||||||
- 이전 정상 커밋을 `master`에 revert 또는 hotfix로 되돌린다
|
- 배포 실패 시 자동 롤백 (이전 포트로 즉시 복구)
|
||||||
- 서버 파일을 수동으로 복구하지 않는다
|
- 수동 롤백: 이전 정상 커밋을 `master`에 revert 후 다시 배포
|
||||||
- 롤백은 커밋 단위로 추적 가능해야 한다
|
- 긴급 복구: 서버의 `taxbaik_port` 파일 수동 수정
|
||||||
|
|
||||||
### 3.4 서비스 파일 위치
|
### 3.4 서비스 파일 위치
|
||||||
```
|
```
|
||||||
@@ -754,6 +888,22 @@ ssh kjh2064@178.104.200.7 crontab -l | grep backup
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 5-1. 블로그 & FAQ 콘텐츠 작성 규칙
|
||||||
|
|
||||||
|
**핵심**: 고객 임파워먼트 (당신도 할 수 있습니다!)
|
||||||
|
- ✅ 주변에서 흔히 보는 실제 사례 (이름, 나이, 직업 구체화)
|
||||||
|
- ✅ 절세 효과 수치화 ("세금을 X만 원 절약했습니다")
|
||||||
|
- ✅ 중학교 2학년도 이해 가능한 수준
|
||||||
|
- ✅ 단계별 설명 + 표로 시각화
|
||||||
|
- ✅ 결론: "정확하게 하면 이런 이점이 있습니다" (임파워먼트)
|
||||||
|
|
||||||
|
**피해야 할 톤**: "복잡하니까 맡기세요" (세무사 의존성 강화)
|
||||||
|
**세무사 언급**: "더 복잡하면 전문가와 상담하세요" (선택지)
|
||||||
|
|
||||||
|
**자세한 템플릿 및 체크리스트**: `BLOG_TEMPLATE.md` 참고
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 6. 코드 규칙
|
## 6. 코드 규칙
|
||||||
|
|
||||||
### 6.1 C# 네이밍
|
### 6.1 C# 네이밍
|
||||||
@@ -965,9 +1115,9 @@ Admin 로그인 페이지만 [AllowAnonymous]:
|
|||||||
- 페이지 로드 시 `OnInitializedAsync`에서 데이터 가져오기
|
- 페이지 로드 시 `OnInitializedAsync`에서 데이터 가져오기
|
||||||
- 업데이트는 `StateHasChanged()` 호출
|
- 업데이트는 `StateHasChanged()` 호출
|
||||||
|
|
||||||
### 8.6 어드민 그리드 UX (Dorsum ERP 수준)
|
### 8.6 어드민 그리드 UX (더존 세무회계프로그램 수준)
|
||||||
|
|
||||||
**목표**: 패드/PC에 특화된 고밀도 데이터 표시 + ERP 수준의 상호작용성
|
**목표**: 패드/PC에 특화된 고밀도 데이터 표시 + 더존식 상호작용성
|
||||||
|
|
||||||
#### 그리드 기본 원칙
|
#### 그리드 기본 원칙
|
||||||
- **데이터 밀도**: 줄 높이 32px, 최대 주요 정보 5-7개 컬럼 (시각적 혼잡 제거)
|
- **데이터 밀도**: 줄 높이 32px, 최대 주요 정보 5-7개 컬럼 (시각적 혼잡 제거)
|
||||||
@@ -1613,7 +1763,7 @@ public interface INtsApiClient
|
|||||||
|
|
||||||
### 빌드
|
### 빌드
|
||||||
```bash
|
```bash
|
||||||
dotnet build TaxBaik.sln
|
dotnet build src/TaxBaik.sln
|
||||||
```
|
```
|
||||||
|
|
||||||
### 서버 상태 확인 (SSH)
|
### 서버 상태 확인 (SSH)
|
||||||
@@ -1637,7 +1787,7 @@ curl http://127.0.0.1/taxbaik/admin/login
|
|||||||
### E2E 테스트 & 반응형 검증
|
### E2E 테스트 & 반응형 검증
|
||||||
```bash
|
```bash
|
||||||
# 문의 폼 제출
|
# 문의 폼 제출
|
||||||
curl -X POST http://178.104.200.7/taxbaik/contact \
|
curl -X POST http://taxbaik.com/taxbaik/contact \
|
||||||
-d "name=테스트&phone=010-1234-5678&service_type=사업자세무&message=테스트"
|
-d "name=테스트&phone=010-1234-5678&service_type=사업자세무&message=테스트"
|
||||||
|
|
||||||
# 관리자 DB에서 확인
|
# 관리자 DB에서 확인
|
||||||
@@ -1676,7 +1826,7 @@ npx playwright test admin-responsive.spec.ts --project="Desktop Chrome"
|
|||||||
|
|
||||||
**프로덕션 E2E 테스트**:
|
**프로덕션 E2E 테스트**:
|
||||||
```bash
|
```bash
|
||||||
export E2E_BASE_URL="http://178.104.200.7/taxbaik"
|
export E2E_BASE_URL="http://taxbaik.com/taxbaik"
|
||||||
export E2E_ADMIN_USERNAME="test_admin"
|
export E2E_ADMIN_USERNAME="test_admin"
|
||||||
export E2E_ADMIN_PASSWORD="TestAdmin@123456"
|
export E2E_ADMIN_PASSWORD="TestAdmin@123456"
|
||||||
|
|
||||||
@@ -1903,7 +2053,7 @@ else
|
|||||||
|
|
||||||
| 항목 | 이전 | 현재 | 개선 |
|
| 항목 | 이전 | 현재 | 개선 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
| **Blazor 프리렌더링** | `prerender: false` | `prerender: true` | 흰 화면 제거 |
|
| **Blazor 프리렌더링** | 전역 `prerender: false` (로그인 포함 전체 흰 화면) | 페이지별 지정 (로그인만 `prerender: true`, 나머지 `false`) | 로그인 흰 화면 제거, 인증 페이지는 그대로 안정 |
|
||||||
| **배포 헬스 체크** | 40 × 3초 = 120초 | 20 × 3초 = 60초 | -50% |
|
| **배포 헬스 체크** | 40 × 3초 = 120초 | 20 × 3초 = 60초 | -50% |
|
||||||
| **E2E 배포 대기** | 30 × 5초 = 150초 | 20 × 3초 = 60초 | -60% |
|
| **E2E 배포 대기** | 30 × 5초 = 150초 | 20 × 3초 = 60초 | -60% |
|
||||||
| **Playwright 병렬** | `fullyParallel: false` | CI에서 `true` | 테스트 병렬화 |
|
| **Playwright 병렬** | `fullyParallel: false` | CI에서 `true` | 테스트 병렬화 |
|
||||||
@@ -1944,7 +2094,7 @@ else
|
|||||||
2. **Actions run 생성 확인**
|
2. **Actions run 생성 확인**
|
||||||
```powershell
|
```powershell
|
||||||
$headers = @{ Authorization = "token $env:GITEA_TOKEN_TAXBAIK" }
|
$headers = @{ Authorization = "token $env:GITEA_TOKEN_TAXBAIK" }
|
||||||
$runs = Invoke-RestMethod -Headers $headers -Uri "http://178.104.200.7/api/v1/repos/kjh2064/taxbaik/actions/runs?limit=10"
|
$runs = Invoke-RestMethod -Headers $headers -Uri "http://gitea.taxbaik.com/api/v1/repos/kjh2064/taxbaik/actions/runs?limit=10"
|
||||||
$runs.workflow_runs | Select-Object id,path,event,head_sha,display_title,status,conclusion
|
$runs.workflow_runs | Select-Object id,path,event,head_sha,display_title,status,conclusion
|
||||||
```
|
```
|
||||||
`deploy.yml@refs/heads/master`, `event=push`, 최신 `head_sha`가 있어야 배포가 실제로 시작된 것이다.
|
`deploy.yml@refs/heads/master`, `event=push`, 최신 `head_sha`가 있어야 배포가 실제로 시작된 것이다.
|
||||||
@@ -2017,7 +2167,7 @@ else
|
|||||||
| 11/15 ~ 11/30 | 종합부동산세 납부 | `comprehensive-real-estate-tax` | real-estate-tax |
|
| 11/15 ~ 11/30 | 종합부동산세 납부 | `comprehensive-real-estate-tax` | real-estate-tax |
|
||||||
| 12/1 ~ 12/31 | 연말 증여·절세 플래닝 | `year-end-gift` | family-asset |
|
| 12/1 ~ 12/31 | 연말 증여·절세 플래닝 | `year-end-gift` | family-asset |
|
||||||
|
|
||||||
캘린더 정의 위치: `TaxBaik.Application/Seasonal/TaxSeasonCalendar.cs`
|
캘린더 정의 위치: `src/TaxBaik.Application/Seasonal/TaxSeasonCalendar.cs`
|
||||||
|
|
||||||
시즌 추가/수정은 이 파일만 변경하면 된다. DB·마이그레이션 변경 없음.
|
시즌 추가/수정은 이 파일만 변경하면 된다. DB·마이그레이션 변경 없음.
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY ./publish/ .
|
|
||||||
|
|
||||||
EXPOSE 5001
|
|
||||||
|
|
||||||
ENTRYPOINT ["dotnet", "TaxBaik.Web.dll"]
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY ./publish/ .
|
|
||||||
|
|
||||||
EXPOSE 5001
|
|
||||||
|
|
||||||
ENTRYPOINT ["dotnet", "TaxBaik.Web.dll"]
|
|
||||||
@@ -168,7 +168,7 @@ master 브랜치에 푸시하면 파이프라인이 다음 단계를 수행합
|
|||||||
- `TAXBAIK_ADMIN_TEST_PASSWORD`: 배포 검증용 관리자 비밀번호
|
- `TAXBAIK_ADMIN_TEST_PASSWORD`: 배포 검증용 관리자 비밀번호
|
||||||
- `Admin__PasswordResetToken`: 관리자 비밀번호 재설정 API용 서버 비밀값
|
- `Admin__PasswordResetToken`: 관리자 비밀번호 재설정 API용 서버 비밀값
|
||||||
|
|
||||||
수동 배포는 비상 롤백 절차 외에는 사용하지 않습니다. 실패 시 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)의 CI 점검 절차를 따릅니다.
|
배포는 Gitea Actions CI/CD로만 수행합니다. 수동 배포 경로는 CI 하네스로 차단되어 있으며, 실패 시 [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md)의 CI 점검 절차를 따릅니다.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -270,7 +270,13 @@ echo $ConnectionStrings__Default
|
|||||||
|
|
||||||
## 문서
|
## 문서
|
||||||
|
|
||||||
- [CLAUDE.md](./CLAUDE.md) - LLM 개발 지침 (9개 섹션)
|
- [docs/INDEX.md](./docs/INDEX.md) - 현재 개발 기준 인덱스
|
||||||
|
- [docs/ENGINEERING_HARNESS.md](./docs/ENGINEERING_HARNESS.md) - 코드 품질, API-first, CI/CD 하네스
|
||||||
|
- [docs/DOUZONE_UX_GUIDE.md](./docs/DOUZONE_UX_GUIDE.md) - 더존식 어드민 UX 원칙과 템플릿 기준
|
||||||
|
- [docs/COMMON_CODE_POLICY.md](./docs/COMMON_CODE_POLICY.md) - 공통코드 저장값/컬럼 길이/하드코딩 금지 기준
|
||||||
|
- [docs/COMBO_POLICY.md](./docs/COMBO_POLICY.md) - 콤보/검색/선택 입력 정책
|
||||||
|
- [docs/ADMIN_PATTERN_CRITIQUE_WBS.md](./docs/ADMIN_PATTERN_CRITIQUE_WBS.md) - 어드민 패턴 비판 및 정량 WBS
|
||||||
|
- [CLAUDE.md](./CLAUDE.md) - 보조 LLM 개발 지침
|
||||||
- [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) - 배포 완전 가이드
|
- [DEPLOYMENT_GUIDE.md](./DEPLOYMENT_GUIDE.md) - 배포 완전 가이드
|
||||||
- [SERVER_SETUP.sh](./SERVER_SETUP.sh) - 서버 자동 설치 스크립트
|
- [SERVER_SETUP.sh](./SERVER_SETUP.sh) - 서버 자동 설치 스크립트
|
||||||
|
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# TaxBaik Server Setup Script
|
|
||||||
# Run on Ubuntu 26.04 server as root or with sudo
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "===== TaxBaik Server Setup ====="
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
DEPLOY_USER="kjh2064"
|
|
||||||
DB_NAME="taxbaikdb"
|
|
||||||
DB_USER="taxbaik"
|
|
||||||
DB_PASSWORD="${DB_PASSWORD:-$(openssl rand -base64 12)}" # Use env var or generate
|
|
||||||
DEPLOY_DIR="/home/$DEPLOY_USER"
|
|
||||||
|
|
||||||
echo -e "${BLUE}1. Installing .NET 8 Runtime${NC}"
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y dotnet-runtime-8.0 aspnetcore-runtime-8.0
|
|
||||||
|
|
||||||
echo -e "${BLUE}2. Installing PostgreSQL 18${NC}"
|
|
||||||
sudo apt-get install -y postgresql postgresql-contrib
|
|
||||||
|
|
||||||
echo -e "${BLUE}3. Creating database and user${NC}"
|
|
||||||
sudo -u postgres psql << EOF
|
|
||||||
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
|
|
||||||
CREATE DATABASE $DB_NAME OWNER $DB_USER;
|
|
||||||
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo -e "${BLUE}4. Creating deployment directories${NC}"
|
|
||||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/deployments
|
|
||||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/taxbaik_active
|
|
||||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/taxbaik_admin_active
|
|
||||||
|
|
||||||
echo -e "${BLUE}5. Installing systemd service files${NC}"
|
|
||||||
sudo cp deploy/taxbaik.service /etc/systemd/system/
|
|
||||||
sudo cp deploy/taxbaik-admin.service /etc/systemd/system/
|
|
||||||
|
|
||||||
# Update environment variables in service files
|
|
||||||
sudo sed -i "s/YOUR_SECURE_PASSWORD_HERE/$DB_PASSWORD/g" /etc/systemd/system/taxbaik.service
|
|
||||||
sudo sed -i "s/YOUR_SECURE_PASSWORD_HERE/$DB_PASSWORD/g" /etc/systemd/system/taxbaik-admin.service
|
|
||||||
|
|
||||||
echo -e "${BLUE}6. Configuring Nginx${NC}"
|
|
||||||
sudo mkdir -p /etc/nginx/conf.d
|
|
||||||
sudo cp deploy/nginx-taxbaik-locations.conf /etc/nginx/conf.d/taxbaik.conf
|
|
||||||
sudo nginx -t
|
|
||||||
sudo systemctl reload nginx
|
|
||||||
|
|
||||||
echo -e "${BLUE}7. Enabling services${NC}"
|
|
||||||
sudo systemctl daemon-reload
|
|
||||||
sudo systemctl enable taxbaik taxbaik-admin
|
|
||||||
sudo systemctl enable postgresql
|
|
||||||
|
|
||||||
echo -e "${GREEN}===== Setup Complete ====="
|
|
||||||
echo ""
|
|
||||||
echo "Database credentials:"
|
|
||||||
echo " Host: localhost"
|
|
||||||
echo " Database: $DB_NAME"
|
|
||||||
echo " User: $DB_USER"
|
|
||||||
echo " Password: $DB_PASSWORD"
|
|
||||||
echo ""
|
|
||||||
echo "Next steps:"
|
|
||||||
echo " 1. Copy the first deployment to ~/deployments/taxbaik_TIMESTAMP/"
|
|
||||||
echo " 2. Create symlinks:"
|
|
||||||
echo " ln -s ~/deployments/taxbaik_TIMESTAMP ~/taxbaik_active"
|
|
||||||
echo " ln -s ~/deployments/taxbaik_admin_TIMESTAMP ~/taxbaik_admin_active"
|
|
||||||
echo " 3. Start services:"
|
|
||||||
echo " sudo systemctl start taxbaik taxbaik-admin"
|
|
||||||
echo " 4. Verify:"
|
|
||||||
echo " sudo systemctl status taxbaik taxbaik-admin"
|
|
||||||
echo " curl http://127.0.0.1:5001/taxbaik"
|
|
||||||
echo " curl http://127.0.0.1:5002/taxbaik/admin/login"
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
namespace TaxBaik.Application.DTOs;
|
|
||||||
|
|
||||||
public class CreateBlogPostDto
|
|
||||||
{
|
|
||||||
public required string Title { get; set; }
|
|
||||||
public required string Content { get; set; }
|
|
||||||
public int? CategoryId { get; set; }
|
|
||||||
public string? Tags { get; set; }
|
|
||||||
public string? SeoTitle { get; set; }
|
|
||||||
public string? SeoDescription { get; set; }
|
|
||||||
public string? ThumbnailUrl { get; set; }
|
|
||||||
public bool IsPublished { get; set; }
|
|
||||||
public int? AuthorId { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
@using TaxBaik.Application.DTOs
|
|
||||||
@using TaxBaik.Application.Services
|
|
||||||
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudTextField @bind-Value="model.Name" Label="이름"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Phone" Label="전화번호 (예: 010-1234-5678)"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Email" Label="이메일"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" InputType="InputType.Email" />
|
|
||||||
|
|
||||||
<MudSelect @bind-Value="model.ServiceType" Label="문의 유형"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4">
|
|
||||||
<MudSelectItem Value="@("사업자세무")">사업자세무</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("부동산세금")">부동산세금</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("가족자산")">가족자산</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("기타")">기타</MudSelectItem>
|
|
||||||
</MudSelect>
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Message" Label="문의 내용"
|
|
||||||
Variant="Variant.Outlined" Lines="5" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudSelect @bind-Value="model.Status" Label="상태"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4">
|
|
||||||
<MudSelectItem Value="@("new")">신규</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("consulting")">상담중</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("contracted")">계약완료</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("rejected")">거절</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("closed")">종결</MudSelectItem>
|
|
||||||
</MudSelect>
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.AdminMemo" Label="관리 메모"
|
|
||||||
Variant="Variant.Outlined" Lines="3" Class="mb-4" />
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" @onclick="HandleSubmit">
|
|
||||||
@ButtonText
|
|
||||||
</MudButton>
|
|
||||||
<MudButton Variant="Variant.Outlined" @onclick="OnCancel">취소</MudButton>
|
|
||||||
</div>
|
|
||||||
</MudForm>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter, EditorRequired]
|
|
||||||
public string ButtonText { get; set; } = "저장";
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<InquiryFormModel> OnSubmit { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback OnCancel { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public InquiryFormModel? InitialData { get; set; }
|
|
||||||
|
|
||||||
private MudForm? form;
|
|
||||||
private InquiryFormModel model = new();
|
|
||||||
|
|
||||||
protected override void OnInitialized()
|
|
||||||
{
|
|
||||||
if (InitialData != null)
|
|
||||||
{
|
|
||||||
model = new InquiryFormModel
|
|
||||||
{
|
|
||||||
Name = InitialData.Name,
|
|
||||||
Phone = InitialData.Phone,
|
|
||||||
Email = InitialData.Email,
|
|
||||||
ServiceType = InitialData.ServiceType,
|
|
||||||
Message = InitialData.Message,
|
|
||||||
Status = InitialData.Status,
|
|
||||||
AdminMemo = InitialData.AdminMemo
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HandleSubmit()
|
|
||||||
{
|
|
||||||
if (form == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
await form.Validate();
|
|
||||||
if (!form.IsValid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
await OnSubmit.InvokeAsync(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InquiryFormModel
|
|
||||||
{
|
|
||||||
public string Name { get; set; } = "";
|
|
||||||
public string Phone { get; set; } = "";
|
|
||||||
public string? Email { get; set; }
|
|
||||||
public string ServiceType { get; set; } = "기타";
|
|
||||||
public string Message { get; set; } = "";
|
|
||||||
public string Status { get; set; } = "new";
|
|
||||||
public string? AdminMemo { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
@inherits LayoutComponentBase
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
@inject IJSRuntime JS
|
|
||||||
@implements IDisposable
|
|
||||||
|
|
||||||
<MudLayout Class="admin-shell">
|
|
||||||
<MudAppBar Elevation="0" Class="admin-topbar">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Menu"
|
|
||||||
Color="Color.Inherit"
|
|
||||||
Edge="Edge.Start"
|
|
||||||
Class="admin-menu-button"
|
|
||||||
OnClick="@ToggleDrawer" />
|
|
||||||
<div class="admin-topbar-title">
|
|
||||||
<MudText Typo="Typo.caption" Color="Color.Secondary">TaxBaik Admin</MudText>
|
|
||||||
<MudText Typo="Typo.h6">세무회계 관리 대시보드</MudText>
|
|
||||||
</div>
|
|
||||||
<MudSpacer />
|
|
||||||
|
|
||||||
<!-- 상단 액션 바 -->
|
|
||||||
<div class="admin-topbar-actions">
|
|
||||||
<MudTooltip Text="공개 웹사이트 방문">
|
|
||||||
<MudButton Class="admin-topbar-action"
|
|
||||||
Variant="Variant.Text"
|
|
||||||
Color="Color.Inherit"
|
|
||||||
Size="Size.Small"
|
|
||||||
StartIcon="@Icons.Material.Filled.OpenInNew"
|
|
||||||
Href="/taxbaik"
|
|
||||||
Target="_blank">
|
|
||||||
공개 사이트
|
|
||||||
</MudButton>
|
|
||||||
</MudTooltip>
|
|
||||||
|
|
||||||
<MudDivider Vertical="true" FlexItem="true" Class="mx-2" />
|
|
||||||
|
|
||||||
<MudTooltip Text="로그아웃 (Ctrl+Q)">
|
|
||||||
<MudButton Class="admin-topbar-action"
|
|
||||||
Variant="Variant.Text"
|
|
||||||
Color="Color.Error"
|
|
||||||
Size="Size.Small"
|
|
||||||
StartIcon="@Icons.Material.Filled.Logout"
|
|
||||||
Href="/taxbaik/admin/logout">
|
|
||||||
로그아웃
|
|
||||||
</MudButton>
|
|
||||||
</MudTooltip>
|
|
||||||
</div>
|
|
||||||
</MudAppBar>
|
|
||||||
|
|
||||||
<MudDrawer @bind-open="@drawerOpen"
|
|
||||||
Elevation="0"
|
|
||||||
Variant="DrawerVariant.Responsive"
|
|
||||||
Breakpoint="Breakpoint.Md"
|
|
||||||
Class="admin-drawer">
|
|
||||||
<div class="admin-drawer-brand">
|
|
||||||
<div class="admin-brand-mark">T</div>
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.subtitle1">TaxBaik</MudText>
|
|
||||||
<MudText Typo="Typo.caption">세무 운영 콘솔</MudText>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<MudNavMenu Class="admin-nav">
|
|
||||||
<MudNavLink Href="/taxbaik/admin/dashboard" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Dashboard">대시보드</MudNavLink>
|
|
||||||
|
|
||||||
<MudNavGroup Title="CRM & 세무관리" Icon="@Icons.Material.Filled.BusinessCenter" @bind-Expanded="@expandedCRMGroup">
|
|
||||||
<MudNavLink Href="/taxbaik/admin/tax-profiles" Icon="@Icons.Material.Filled.Assignment">세무 프로필</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/tax-filing-schedules" Icon="@Icons.Material.Filled.CalendarMonth">신고 일정</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/contracts" Icon="@Icons.Material.Filled.Description">계약 관리</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/consulting-activities" Icon="@Icons.Material.Filled.ChatBubble">상담 활동</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/revenue-trackings" Icon="@Icons.Material.Filled.Receipt">수익 추적</MudNavLink>
|
|
||||||
</MudNavGroup>
|
|
||||||
|
|
||||||
<MudNavGroup Title="고객 관리" Icon="@Icons.Material.Filled.PeopleAlt" @bind-Expanded="@expandedCustomerGroup">
|
|
||||||
<MudNavLink Href="/taxbaik/admin/clients" Icon="@Icons.Material.Filled.ContactPage">고객 카드</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/tax-filings" Icon="@Icons.Material.Filled.Assessment">세무신고</MudNavLink>
|
|
||||||
</MudNavGroup>
|
|
||||||
|
|
||||||
<MudNavGroup Title="홈페이지" Icon="@Icons.Material.Filled.Home" @bind-Expanded="@expandedWebsiteGroup">
|
|
||||||
<MudNavLink Href="/taxbaik/admin/announcements" Icon="@Icons.Material.Filled.Campaign">공지사항</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/faqs" Icon="@Icons.Material.Filled.QuestionAnswer">FAQ 관리</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/blog" Icon="@Icons.Material.Filled.Article">블로그 관리</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/season-simulator" Icon="@Icons.Material.Filled.Preview">시즌 시뮬레이터</MudNavLink>
|
|
||||||
</MudNavGroup>
|
|
||||||
|
|
||||||
<MudNavLink Href="/taxbaik/admin/inquiries" Icon="@Icons.Material.Filled.Forum">문의 관리</MudNavLink>
|
|
||||||
<MudNavLink Href="/taxbaik/admin/settings" Icon="@Icons.Material.Filled.Tune">설정</MudNavLink>
|
|
||||||
</MudNavMenu>
|
|
||||||
</MudDrawer>
|
|
||||||
|
|
||||||
<MudMainContent Class="admin-main">
|
|
||||||
<MudContainer MaxWidth="MaxWidth.False" Class="admin-content">
|
|
||||||
@Body
|
|
||||||
</MudContainer>
|
|
||||||
</MudMainContent>
|
|
||||||
</MudLayout>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private bool drawerOpen = true;
|
|
||||||
private bool expandedCRMGroup = true;
|
|
||||||
private bool expandedCustomerGroup = false;
|
|
||||||
private bool expandedWebsiteGroup = false;
|
|
||||||
|
|
||||||
protected override void OnInitialized()
|
|
||||||
{
|
|
||||||
Navigation.LocationChanged += OnLocationChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
||||||
{
|
|
||||||
if (!firstRender)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var viewportWidth = await JS.InvokeAsync<int>("taxbaikAdminSession.getViewportWidth");
|
|
||||||
drawerOpen = viewportWidth >= 960;
|
|
||||||
StateHasChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnLocationChanged(object? sender, LocationChangedEventArgs args)
|
|
||||||
{
|
|
||||||
_ = InvokeAsync(() => JS.InvokeVoidAsync("taxbaikAdminSession.showLoading"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleDrawer()
|
|
||||||
{
|
|
||||||
drawerOpen = !drawerOpen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Navigation.LocationChanged -= OnLocationChanged;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
@page "/admin/blog/create"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Application.DTOs
|
|
||||||
@using TaxBaik.Application.Services
|
|
||||||
@using TaxBaik.Domain.Interfaces
|
|
||||||
@inject BlogService BlogService
|
|
||||||
@inject ICategoryRepository CategoryRepository
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
|
|
||||||
<PageTitle>새 포스트 작성</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Content</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">새 포스트 작성</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">새로운 블로그 포스트를 작성합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Close" @onclick="GoBack">취소</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="pa-4 mt-4" Elevation="1">
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudTextField @bind-Value="model.Title" Label="제목"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudSelect T="int?" @bind-Value="model.CategoryId" Label="카테고리"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4">
|
|
||||||
@foreach (var category in categories)
|
|
||||||
{
|
|
||||||
<MudSelectItem T="int?" Value="@((int?)category.Id)">@category.Name</MudSelectItem>
|
|
||||||
}
|
|
||||||
</MudSelect>
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Content" Label="본문"
|
|
||||||
Variant="Variant.Outlined" Lines="10" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Tags" Label="태그 (쉼표로 구분)"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.SeoTitle" Label="SEO 제목"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.SeoDescription" Label="SEO 설명"
|
|
||||||
Variant="Variant.Outlined" Lines="3" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudCheckBox @bind-Checked="model.IsPublished" Label="즉시 발행" Class="mb-4" />
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary"
|
|
||||||
@onclick="SavePost">저장</MudButton>
|
|
||||||
</div>
|
|
||||||
</MudForm>
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private MudForm? form;
|
|
||||||
private List<Domain.Entities.Category> categories = [];
|
|
||||||
private CreatePostModel model = new();
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
categories = (await CategoryRepository.GetAllAsync()).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GoBack()
|
|
||||||
{
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/blog");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SavePost()
|
|
||||||
{
|
|
||||||
if (form == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
await form.Validate();
|
|
||||||
if (!form.IsValid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await BlogService.CreateAsync(new CreateBlogPostDto
|
|
||||||
{
|
|
||||||
Title = model.Title,
|
|
||||||
Content = model.Content,
|
|
||||||
CategoryId = model.CategoryId,
|
|
||||||
Tags = model.Tags,
|
|
||||||
SeoTitle = model.SeoTitle,
|
|
||||||
SeoDescription = model.SeoDescription,
|
|
||||||
IsPublished = model.IsPublished
|
|
||||||
});
|
|
||||||
|
|
||||||
Snackbar.Add("포스트가 저장되었습니다.", Severity.Success);
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/blog");
|
|
||||||
}
|
|
||||||
catch (ValidationException ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add(ex.Message, Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class CreatePostModel
|
|
||||||
{
|
|
||||||
public string Title { get; set; } = "";
|
|
||||||
public string Content { get; set; } = "";
|
|
||||||
public int? CategoryId { get; set; }
|
|
||||||
public string? Tags { get; set; }
|
|
||||||
public string? SeoTitle { get; set; }
|
|
||||||
public string? SeoDescription { get; set; }
|
|
||||||
public bool IsPublished { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
@page "/admin/blog/{id:int}/edit"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Application.DTOs
|
|
||||||
@using TaxBaik.Application.Services
|
|
||||||
@using TaxBaik.Domain.Interfaces
|
|
||||||
@inject BlogService BlogService
|
|
||||||
@inject ICategoryRepository CategoryRepository
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
@inject IDialogService DialogService
|
|
||||||
|
|
||||||
<PageTitle>포스트 수정</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Content</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">포스트 수정</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">블로그 포스트를 수정합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Close" @onclick="GoBack">취소</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
@if (isLoading)
|
|
||||||
{
|
|
||||||
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="mt-4" />
|
|
||||||
}
|
|
||||||
else if (post == null)
|
|
||||||
{
|
|
||||||
<MudAlert Severity="Severity.Error" Class="mt-4">포스트를 찾을 수 없습니다.</MudAlert>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudPaper Class="pa-4 mt-4" Elevation="1">
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudTextField @bind-Value="model.Title" Label="제목"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudSelect T="int?" @bind-Value="model.CategoryId" Label="카테고리"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4">
|
|
||||||
@foreach (var category in categories)
|
|
||||||
{
|
|
||||||
<MudSelectItem T="int?" Value="@((int?)category.Id)">@category.Name</MudSelectItem>
|
|
||||||
}
|
|
||||||
</MudSelect>
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Content" Label="본문"
|
|
||||||
Variant="Variant.Outlined" Lines="10" Class="mb-4" Required="true" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.Tags" Label="태그 (쉼표로 구분)"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.SeoTitle" Label="SEO 제목"
|
|
||||||
Variant="Variant.Outlined" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudTextField @bind-Value="model.SeoDescription" Label="SEO 설명"
|
|
||||||
Variant="Variant.Outlined" Lines="3" Class="mb-4" />
|
|
||||||
|
|
||||||
<MudCheckBox @bind-Checked="model.IsPublished" Label="발행" Class="mb-4" />
|
|
||||||
|
|
||||||
<div class="d-flex gap-2">
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary"
|
|
||||||
@onclick="SavePost">저장</MudButton>
|
|
||||||
<MudButton Variant="Variant.Outlined" Color="Color.Error"
|
|
||||||
@onclick="DeletePost">삭제</MudButton>
|
|
||||||
</div>
|
|
||||||
</MudForm>
|
|
||||||
</MudPaper>
|
|
||||||
}
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter]
|
|
||||||
public int Id { get; set; }
|
|
||||||
|
|
||||||
private MudForm? form;
|
|
||||||
private Domain.Entities.BlogPost? post;
|
|
||||||
private List<Domain.Entities.Category> categories = [];
|
|
||||||
private EditPostModel model = new();
|
|
||||||
private bool isLoading = true;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
post = await BlogService.GetByIdAsync(Id);
|
|
||||||
if (post != null)
|
|
||||||
{
|
|
||||||
categories = (await CategoryRepository.GetAllAsync()).ToList();
|
|
||||||
MapPostToModel(post);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"포스트 로드 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MapPostToModel(Domain.Entities.BlogPost post)
|
|
||||||
{
|
|
||||||
model.Title = post.Title;
|
|
||||||
model.Content = post.Content;
|
|
||||||
model.CategoryId = post.CategoryId;
|
|
||||||
model.Tags = post.Tags;
|
|
||||||
model.SeoTitle = post.SeoTitle;
|
|
||||||
model.SeoDescription = post.SeoDescription;
|
|
||||||
model.IsPublished = post.IsPublished;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GoBack()
|
|
||||||
{
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/blog");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SavePost()
|
|
||||||
{
|
|
||||||
if (form == null || post == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
await form.Validate();
|
|
||||||
if (!form.IsValid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await BlogService.UpdateAsync(post.Id, new CreateBlogPostDto
|
|
||||||
{
|
|
||||||
Title = model.Title,
|
|
||||||
Content = model.Content,
|
|
||||||
CategoryId = model.CategoryId,
|
|
||||||
Tags = model.Tags,
|
|
||||||
SeoTitle = model.SeoTitle,
|
|
||||||
SeoDescription = model.SeoDescription,
|
|
||||||
IsPublished = model.IsPublished
|
|
||||||
});
|
|
||||||
|
|
||||||
Snackbar.Add("포스트가 저장되었습니다.", Severity.Success);
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/blog");
|
|
||||||
}
|
|
||||||
catch (ValidationException ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add(ex.Message, Severity.Error);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeletePost()
|
|
||||||
{
|
|
||||||
if (post == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var result = await DialogService.ShowMessageBox(
|
|
||||||
"포스트 삭제",
|
|
||||||
"정말 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
|
|
||||||
"삭제", "취소");
|
|
||||||
|
|
||||||
if (result != true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await BlogService.DeleteAsync(post.Id);
|
|
||||||
Snackbar.Add("포스트가 삭제되었습니다.", Severity.Success);
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/blog");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class EditPostModel
|
|
||||||
{
|
|
||||||
public string Title { get; set; } = "";
|
|
||||||
public string Content { get; set; } = "";
|
|
||||||
public int? CategoryId { get; set; }
|
|
||||||
public string? Tags { get; set; }
|
|
||||||
public string? SeoTitle { get; set; }
|
|
||||||
public string? SeoDescription { get; set; }
|
|
||||||
public bool IsPublished { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
@page "/admin/blog"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@inject IApiClient ApiClient
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
|
|
||||||
<PageTitle>블로그 관리</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Content</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">블로그 관리</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">검색 유입 콘텐츠의 발행 상태와 성과를 관리합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.EditNote"
|
|
||||||
Href="/taxbaik/admin/blog/create">새 포스트 작성</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface mb-4" Elevation="0">
|
|
||||||
<MudStack Row="true" AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween">
|
|
||||||
<MudText Typo="Typo.subtitle1">@($"전체 포스트 {totalPosts}개")</MudText>
|
|
||||||
<MudText Typo="Typo.body2">페이지 @currentPage / @totalPages</MudText>
|
|
||||||
</MudStack>
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
<MudDataGrid Items="@posts" Striped="true" Hoverable="true" Loading="@isLoading" Class="admin-grid">
|
|
||||||
<Columns>
|
|
||||||
<PropertyColumn Property="x => x.Title" Title="제목" />
|
|
||||||
<PropertyColumn Property="x => x.IsPublished" Title="발행">
|
|
||||||
<CellTemplate Context="cell">
|
|
||||||
<MudCheckBox T="bool" Value="@cell.Item.IsPublished"
|
|
||||||
ValueChanged="@(async (bool value) => await TogglePublish(cell.Item, value))" />
|
|
||||||
</CellTemplate>
|
|
||||||
</PropertyColumn>
|
|
||||||
<PropertyColumn Property="x => x.ViewCount" Title="조회수" />
|
|
||||||
<PropertyColumn Property="x => x.CreatedAt" Title="작성일" Format="yyyy-MM-dd" />
|
|
||||||
<TemplateColumn>
|
|
||||||
<CellTemplate Context="cell">
|
|
||||||
<MudButton Variant="Variant.Outlined" Size="Size.Small" Color="Color.Primary"
|
|
||||||
Href="@($"/taxbaik/admin/blog/{cell.Item.Id}/edit")">수정하기</MudButton>
|
|
||||||
<MudButton Variant="Variant.Text" Size="Size.Small" Color="Color.Error"
|
|
||||||
@onclick="@(async () => await DeletePost(cell.Item.Id))">삭제</MudButton>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
</Columns>
|
|
||||||
</MudDataGrid>
|
|
||||||
|
|
||||||
<MudStack Row="true" Justify="Justify.Center" Class="mt-4" Spacing="2">
|
|
||||||
<MudButton Variant="Variant.Outlined" Disabled="@(currentPage <= 1 || isLoading)" @onclick="PreviousPage">이전</MudButton>
|
|
||||||
<MudButton Variant="Variant.Outlined" Disabled="@(currentPage >= totalPages || isLoading)" @onclick="NextPage">다음</MudButton>
|
|
||||||
</MudStack>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<TaxBaik.Domain.Entities.BlogPost> posts = [];
|
|
||||||
private bool isLoading = true;
|
|
||||||
private int currentPage = 1;
|
|
||||||
private int totalPages = 1;
|
|
||||||
private int totalPosts = 0;
|
|
||||||
private const int PageSize = 20;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await LoadPosts();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadPosts()
|
|
||||||
{
|
|
||||||
isLoading = true;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var result = await ApiClient.GetAsync<PagedBlogResponse>($"blog/admin?page={currentPage}&pageSize={PageSize}");
|
|
||||||
posts = result?.Data ?? [];
|
|
||||||
totalPosts = result?.Total ?? 0;
|
|
||||||
totalPages = Math.Max(1, (int)Math.Ceiling(totalPosts / (double)PageSize));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
posts = [];
|
|
||||||
totalPosts = 0;
|
|
||||||
totalPages = 1;
|
|
||||||
}
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task PreviousPage()
|
|
||||||
{
|
|
||||||
if (currentPage <= 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
currentPage--;
|
|
||||||
await LoadPosts();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task NextPage()
|
|
||||||
{
|
|
||||||
if (currentPage >= totalPages)
|
|
||||||
return;
|
|
||||||
|
|
||||||
currentPage++;
|
|
||||||
await LoadPosts();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task TogglePublish(TaxBaik.Domain.Entities.BlogPost post, bool isPublished)
|
|
||||||
{
|
|
||||||
var previous = post.IsPublished;
|
|
||||||
post.IsPublished = isPublished;
|
|
||||||
var result = await ApiClient.PutAsync<TaxBaik.Domain.Entities.BlogPost>($"blog/{post.Id}", new
|
|
||||||
{
|
|
||||||
post.Title,
|
|
||||||
post.Content,
|
|
||||||
post.CategoryId,
|
|
||||||
post.Tags,
|
|
||||||
post.SeoTitle,
|
|
||||||
post.SeoDescription,
|
|
||||||
post.ThumbnailUrl,
|
|
||||||
IsPublished = isPublished,
|
|
||||||
post.AuthorId
|
|
||||||
});
|
|
||||||
|
|
||||||
if (result == null)
|
|
||||||
{
|
|
||||||
post.IsPublished = previous;
|
|
||||||
Snackbar.Add("발행 상태 변경에 실패했습니다.", Severity.Error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Snackbar.Add("발행 상태가 변경되었습니다.", Severity.Success);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeletePost(int postId)
|
|
||||||
{
|
|
||||||
await ApiClient.DeleteAsync($"blog/{postId}");
|
|
||||||
Snackbar.Add("포스트가 삭제되었습니다.", Severity.Success);
|
|
||||||
await LoadPosts();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class PagedBlogResponse
|
|
||||||
{
|
|
||||||
public List<TaxBaik.Domain.Entities.BlogPost> Data { get; set; } = [];
|
|
||||||
public int Total { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,228 +0,0 @@
|
|||||||
@page "/admin/contracts"
|
|
||||||
@using TaxBaik.Web.Services.AdminClients
|
|
||||||
@inject IContractBrowserClient ContractClient
|
|
||||||
@inject IClientBrowserClient ClientClient
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
@inject IDialogService DialogService
|
|
||||||
@attribute [Authorize]
|
|
||||||
|
|
||||||
<PageTitle>계약 관리</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">CRM & 세무관리</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">계약 관리</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">고객 계약과 월 정기수익을 함께 관리합니다.</MudText>
|
|
||||||
@if (mrr > 0)
|
|
||||||
{
|
|
||||||
<MudText Typo="Typo.body2" Class="mt-2">
|
|
||||||
월 정기수익:
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Primary" Variant="Variant.Filled">₩@mrr.ToString("N0")</MudChip>
|
|
||||||
</MudText>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OpenCreateDialog" StartIcon="@Icons.Material.Filled.Add">
|
|
||||||
새 계약 추가
|
|
||||||
</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface" Elevation="0">
|
|
||||||
@if (contracts is null)
|
|
||||||
{
|
|
||||||
<MudProgressLinear Indeterminate="true" />
|
|
||||||
}
|
|
||||||
else if (contracts.Count == 0)
|
|
||||||
{
|
|
||||||
<MudAlert Severity="Severity.Info" Class="mt-4">
|
|
||||||
<MudIcon Icon="@Icons.Material.Filled.Description" Class="me-2" />
|
|
||||||
계약이 없습니다.
|
|
||||||
</MudAlert>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudDataGrid T="Contract"
|
|
||||||
Items="@contracts"
|
|
||||||
Dense="true"
|
|
||||||
Hover="true"
|
|
||||||
Striped="true"
|
|
||||||
Virtualize="true"
|
|
||||||
RowsPerPage="30"
|
|
||||||
Class="admin-grid">
|
|
||||||
<Columns>
|
|
||||||
<PropertyColumn Property="x => x.Id" Title="ID" Sortable="true" />
|
|
||||||
<TemplateColumn Title="고객">
|
|
||||||
<CellTemplate>
|
|
||||||
@if (clientMap.TryGetValue(context.Item.ClientId, out var clientName))
|
|
||||||
{
|
|
||||||
<MudLink Href="@($"/taxbaik/admin/clients/{context.Item.ClientId}")" Color="Color.Primary">
|
|
||||||
@clientName
|
|
||||||
</MudLink>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<PropertyColumn Property="x => x.ContractNumber" Title="계약번호" />
|
|
||||||
<PropertyColumn Property="x => x.ServiceType" Title="서비스 유형" />
|
|
||||||
<PropertyColumn Property="x => x.MonthlyFee" Title="월 수수료" Format="C" />
|
|
||||||
<TemplateColumn Title="계약기간">
|
|
||||||
<CellTemplate>
|
|
||||||
@context.Item.StartDate.ToString("yyyy-MM-dd")
|
|
||||||
@if (context.Item.EndDate.HasValue)
|
|
||||||
{
|
|
||||||
<span>~@context.Item.EndDate.Value.ToString("yyyy-MM-dd")</span>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<TemplateColumn Title="상태">
|
|
||||||
<CellTemplate>
|
|
||||||
@{
|
|
||||||
var isActive = !context.Item.EndDate.HasValue || context.Item.EndDate.Value >= DateTime.Today;
|
|
||||||
}
|
|
||||||
@if (isActive)
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Success" Variant="Variant.Filled">활성</MudChip>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Default" Variant="Variant.Outlined">만료</MudChip>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<TemplateColumn Title="작업" Sortable="false">
|
|
||||||
<CellTemplate>
|
|
||||||
<MudButtonGroup Size="Size.Small" Variant="Variant.Outlined">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error"
|
|
||||||
OnClick="@(async () => await DeleteContract(context.Item.Id))" />
|
|
||||||
</MudButtonGroup>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
</Columns>
|
|
||||||
</MudDataGrid>
|
|
||||||
}
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
<!-- Create Dialog -->
|
|
||||||
<MudDialog @bind-IsVisible="isDialogOpen" Options="new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true }">
|
|
||||||
<TitleContent>
|
|
||||||
<MudText Typo="Typo.h6">새 계약 추가</MudText>
|
|
||||||
</TitleContent>
|
|
||||||
<DialogContent>
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudSelect T="int" @bind-Value="contractForm.ClientId" Label="고객" Required="true" Variant="Variant.Outlined" FullWidth="true" Class="mb-4">
|
|
||||||
@foreach (var client in clients)
|
|
||||||
{
|
|
||||||
<MudSelectItem Value="@client.Id">@client.CompanyName</MudSelectItem>
|
|
||||||
}
|
|
||||||
</MudSelect>
|
|
||||||
<MudTextField T="string" @bind-Value="contractForm.ContractNumber" Label="계약번호" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
<MudTextField T="string" @bind-Value="contractForm.ServiceType" Label="서비스 유형" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
<MudDatePicker @bind-Date="contractForm.StartDate" Label="계약 시작일" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
<MudNumericField T="decimal?" @bind-Value="contractForm.MonthlyFee" Label="월 수수료" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" />
|
|
||||||
</MudForm>
|
|
||||||
</DialogContent>
|
|
||||||
<DialogActions>
|
|
||||||
<MudButton OnClick="CloseDialog">취소</MudButton>
|
|
||||||
<MudButton Color="Color.Primary" OnClick="SaveContract">저장</MudButton>
|
|
||||||
</DialogActions>
|
|
||||||
</MudDialog>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<Contract>? contracts;
|
|
||||||
private List<Client> clients = [];
|
|
||||||
private Dictionary<int, string> clientMap = new();
|
|
||||||
private decimal mrr = 0;
|
|
||||||
private MudForm? form;
|
|
||||||
private bool isDialogOpen;
|
|
||||||
private ContractForm contractForm = new();
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadData()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
contracts = await ContractClient.GetAllAsync();
|
|
||||||
var (clientItems, _) = await ClientClient.GetPagedAsync();
|
|
||||||
clients = clientItems.ToList();
|
|
||||||
clientMap = clients.ToDictionary(c => c.Id, c => c.CompanyName ?? "");
|
|
||||||
mrr = await ContractClient.GetMonthlyRecurringRevenueAsync();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"데이터 로드 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OpenCreateDialog()
|
|
||||||
{
|
|
||||||
contractForm = new();
|
|
||||||
isDialogOpen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SaveContract()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var newId = await ContractClient.CreateAsync(
|
|
||||||
contractForm.ClientId,
|
|
||||||
contractForm.ContractNumber,
|
|
||||||
contractForm.ServiceType,
|
|
||||||
contractForm.StartDate ?? DateTime.Now,
|
|
||||||
contractForm.MonthlyFee);
|
|
||||||
|
|
||||||
if (newId > 0)
|
|
||||||
{
|
|
||||||
Snackbar.Add("계약이 추가되었습니다.", Severity.Success);
|
|
||||||
CloseDialog();
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeleteContract(int id)
|
|
||||||
{
|
|
||||||
var parameters = new DialogParameters
|
|
||||||
{
|
|
||||||
{ "Title", "삭제 확인" },
|
|
||||||
{ "Message", "이 계약을 삭제하시겠습니까?" }
|
|
||||||
};
|
|
||||||
|
|
||||||
var dialog = await DialogService.ShowAsync<ConfirmDialog>("", parameters);
|
|
||||||
var result = await dialog.Result;
|
|
||||||
|
|
||||||
if (result?.Canceled ?? true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await ContractClient.DeleteAsync(id);
|
|
||||||
Snackbar.Add("계약이 삭제되었습니다.", Severity.Success);
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CloseDialog()
|
|
||||||
{
|
|
||||||
isDialogOpen = false;
|
|
||||||
contractForm = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ContractForm
|
|
||||||
{
|
|
||||||
public int ClientId { get; set; }
|
|
||||||
public string ContractNumber { get; set; } = "";
|
|
||||||
public string ServiceType { get; set; } = "";
|
|
||||||
public DateTime? StartDate { get; set; }
|
|
||||||
public decimal? MonthlyFee { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
@page "/admin/dashboard"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Web.Services
|
|
||||||
@inject IAdminDashboardClient DashboardClient
|
|
||||||
@inject NavigationManager Nav
|
|
||||||
|
|
||||||
<PageTitle>대시보드</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Overview</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">대시보드</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add" Href="/taxbaik/admin/blog/create">
|
|
||||||
새 포스트 작성
|
|
||||||
</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Metrics Grid - Pure HTML div instead of MudGrid to ensure proper layout -->
|
|
||||||
<div class="admin-metric-grid">
|
|
||||||
<div class="admin-metric-card accent-blue cursor-pointer" @onclick='(() => Nav.NavigateTo("/taxbaik/admin/inquiries"))' style="cursor: pointer;">
|
|
||||||
<div style="display: flex; flex-direction: column; gap: 12px; height: 100%;">
|
|
||||||
<span style="font-size: 0.75rem; color: #999; text-transform: uppercase; font-weight: 600;">이번달 문의</span>
|
|
||||||
<div style="display: flex; justify-content: space-between; align-items: center; flex: 1;">
|
|
||||||
<span style="font-size: 2rem; font-weight: 700; color: #1565c0;">@summary.ThisMonthInquiries</span>
|
|
||||||
<span style="font-size: 2.5rem; opacity: 0.15; color: #1976d2;">💬</span>
|
|
||||||
</div>
|
|
||||||
<span style="font-size: 0.9rem; color: #666;">월간 상담 유입 (클릭 시 이동)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="admin-metric-card accent-amber cursor-pointer" @onclick='(() => Nav.NavigateTo("/taxbaik/admin/inquiries?status=new"))' style="cursor: pointer;">
|
|
||||||
<div style="display: flex; flex-direction: column; gap: 12px; height: 100%;">
|
|
||||||
<span style="font-size: 0.75rem; color: #999; text-transform: uppercase; font-weight: 600;">신규 문의</span>
|
|
||||||
<div style="display: flex; justify-content: space-between; align-items: center; flex: 1;">
|
|
||||||
<span style="font-size: 2rem; font-weight: 700; color: #e65100;">@summary.NewInquiries</span>
|
|
||||||
<span style="font-size: 2.5rem; opacity: 0.15; color: #f57c00;">⚠️</span>
|
|
||||||
</div>
|
|
||||||
<span style="font-size: 0.9rem; color: #666;">처리 대기 (클릭 시 이동)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="admin-metric-card accent-slate cursor-pointer" @onclick='(() => Nav.NavigateTo("/taxbaik/admin/blog"))' style="cursor: pointer;">
|
|
||||||
<div style="display: flex; flex-direction: column; gap: 12px; height: 100%;">
|
|
||||||
<span style="font-size: 0.75rem; color: #999; text-transform: uppercase; font-weight: 600;">전체 포스트</span>
|
|
||||||
<div style="display: flex; justify-content: space-between; align-items: center; flex: 1;">
|
|
||||||
<span style="font-size: 2rem; font-weight: 700; color: #455a64;">@summary.TotalPosts</span>
|
|
||||||
<span style="font-size: 2.5rem; opacity: 0.15; color: #607d8b;">📄</span>
|
|
||||||
</div>
|
|
||||||
<span style="font-size: 0.9rem; color: #666;">콘텐츠 자산 (클릭 시 이동)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="admin-metric-card accent-green cursor-pointer" @onclick='(() => Nav.NavigateTo("/taxbaik/admin/blog"))' style="cursor: pointer;">
|
|
||||||
<div style="display: flex; flex-direction: column; gap: 12px; height: 100%;">
|
|
||||||
<span style="font-size: 0.75rem; color: #999; text-transform: uppercase; font-weight: 600;">발행된 포스트</span>
|
|
||||||
<div style="display: flex; justify-content: space-between; align-items: center; flex: 1;">
|
|
||||||
<span style="font-size: 2rem; font-weight: 700; color: #2e7d32;">@summary.PublishedPosts</span>
|
|
||||||
<span style="font-size: 2.5rem; opacity: 0.15; color: #388e3c;">🌐</span>
|
|
||||||
</div>
|
|
||||||
<span style="font-size: 0.9rem; color: #666;">검색 노출 대상 (클릭 시 이동)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if (upcomingFilings.Count > 0)
|
|
||||||
{
|
|
||||||
<MudPaper Class="admin-surface mt-4" Elevation="0">
|
|
||||||
<div class="admin-section-header">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.h6">이번 달 마감 임박 신고</MudText>
|
|
||||||
<MudText Typo="Typo.body2">30일 이내 신고 예정 건 (고객명 클릭 시 상세 카드로 연결)</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Outlined" Color="Color.Primary" Href="/taxbaik/admin/tax-filings">전체 일정 보기</MudButton>
|
|
||||||
</div>
|
|
||||||
<MudSimpleTable Striped="true" Dense="true" Class="admin-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>고객</th>
|
|
||||||
<th>신고 유형</th>
|
|
||||||
<th>기한</th>
|
|
||||||
<th>D-day</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var f in upcomingFilings)
|
|
||||||
{
|
|
||||||
var dday = (f.DueDate.Date - DateTime.Today).Days;
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<MudLink Href="@($"/taxbaik/admin/clients/{f.ClientId}")" Underline="Underline.Hover" Color="Color.Primary" Class="font-weight-bold">
|
|
||||||
@f.ClientName
|
|
||||||
</MudLink>
|
|
||||||
</td>
|
|
||||||
<td>@f.FilingType</td>
|
|
||||||
<td>@f.DueDate.ToString("yyyy-MM-dd")</td>
|
|
||||||
<td>
|
|
||||||
@if (dday < 0)
|
|
||||||
{
|
|
||||||
<MudChip T="string" Size="Size.Small" Color="Color.Dark">기한 초과 (@(-dday)일)</MudChip>
|
|
||||||
}
|
|
||||||
else if (dday <= 7)
|
|
||||||
{
|
|
||||||
<MudChip T="string" Size="Size.Small" Color="Color.Error">D-@dday</MudChip>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<span>D-@dday</span>
|
|
||||||
}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</MudSimpleTable>
|
|
||||||
</MudPaper>
|
|
||||||
}
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface mt-4" Elevation="0">
|
|
||||||
<div class="admin-section-header">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.h6">최근 문의</MudText>
|
|
||||||
<MudText Typo="Typo.body2">최근 유입된 상담 요청을 빠르게 확인합니다. (이름 클릭 시 상세 관리 화면으로 연계)</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Outlined" Color="Color.Primary" Href="/taxbaik/admin/inquiries">문의 전체 보기</MudButton>
|
|
||||||
</div>
|
|
||||||
<MudSimpleTable Striped="true" Dense="true" Class="admin-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>이름</th>
|
|
||||||
<th>전화</th>
|
|
||||||
<th>분야</th>
|
|
||||||
<th>상태</th>
|
|
||||||
<th>날짜</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var inquiry in summary.RecentInquiries)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<MudLink Href="@($"/taxbaik/admin/inquiries?id={inquiry.Id}")" Underline="Underline.Hover" Color="Color.Primary" Class="font-weight-bold">
|
|
||||||
@inquiry.Name
|
|
||||||
</MudLink>
|
|
||||||
</td>
|
|
||||||
<td>@inquiry.Phone</td>
|
|
||||||
<td>@inquiry.ServiceType</td>
|
|
||||||
<td>
|
|
||||||
<MudChip T="string" Size="Size.Small" Color="@StatusColor(inquiry.Status)">
|
|
||||||
@GetStatusLabel(inquiry.Status)
|
|
||||||
</MudChip>
|
|
||||||
</td>
|
|
||||||
<td>@inquiry.CreatedAt.ToString("yyyy-MM-dd")</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</MudSimpleTable>
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private AdminDashboardSummary summary = new(0, 0, 0, 0, []);
|
|
||||||
private List<Domain.Entities.TaxFiling> upcomingFilings = [];
|
|
||||||
private string? errorMessage;
|
|
||||||
private bool isLoading = true;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// API 클라이언트 사용 (서비스 직접 호출 X)
|
|
||||||
var summaryTask = DashboardClient.GetSummaryAsync();
|
|
||||||
var filingsTask = DashboardClient.GetUpcomingFilingsAsync(30);
|
|
||||||
|
|
||||||
await Task.WhenAll(summaryTask, filingsTask);
|
|
||||||
summary = await summaryTask;
|
|
||||||
upcomingFilings = (await filingsTask).ToList();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
errorMessage = "대시보드 데이터를 불러올 수 없습니다.";
|
|
||||||
Console.Error.WriteLine($"Dashboard error: {ex.Message}");
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status);
|
|
||||||
|
|
||||||
private static Color StatusColor(string status) => status switch
|
|
||||||
{
|
|
||||||
"new" => Color.Warning,
|
|
||||||
"consulting" => Color.Info,
|
|
||||||
"contracted" => Color.Success,
|
|
||||||
"rejected" => Color.Error,
|
|
||||||
"closed" => Color.Dark,
|
|
||||||
_ => Color.Default
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
@page "/admin/faqs"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Web.Services
|
|
||||||
@using TaxBaik.Domain.Entities
|
|
||||||
@inject IFaqBrowserClient FaqClient
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
@inject IDialogService DialogService
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
|
|
||||||
<PageTitle>FAQ 관리</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">홈페이지</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">FAQ 관리</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">홈페이지 자주 묻는 질문을 등록하고 순서를 관리합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary"
|
|
||||||
StartIcon="@Icons.Material.Filled.Add"
|
|
||||||
Href="/taxbaik/admin/faqs/create">
|
|
||||||
FAQ 등록
|
|
||||||
</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface" Elevation="0">
|
|
||||||
@if (faqs is null)
|
|
||||||
{
|
|
||||||
<MudProgressLinear Indeterminate="true" />
|
|
||||||
}
|
|
||||||
else if (!faqs.Any())
|
|
||||||
{
|
|
||||||
<div class="pa-6 text-center">
|
|
||||||
<MudIcon Icon="@Icons.Material.Filled.QuestionAnswer" Style="font-size:3rem; opacity:.3;" />
|
|
||||||
<MudText Class="mt-2 text-muted">등록된 FAQ가 없습니다.</MudText>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudSimpleTable Striped="true" Dense="true" Class="admin-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th style="width:60px;">순서</th>
|
|
||||||
<th>질문</th>
|
|
||||||
<th style="width:130px;">카테고리</th>
|
|
||||||
<th style="width:90px;">상태</th>
|
|
||||||
<th style="width:160px;"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var item in faqs)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td class="text-center">
|
|
||||||
<MudText Typo="Typo.body2">@item.SortOrder</MudText>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<MudText Typo="Typo.body2" Style="max-width:480px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;">
|
|
||||||
@item.Question
|
|
||||||
</MudText>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
@if (!string.IsNullOrEmpty(item.Category))
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Default">@item.Category</MudChip>
|
|
||||||
}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
@if (item.IsActive)
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Success">노출 중</MudChip>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Default">비활성</MudChip>
|
|
||||||
}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<MudButtonGroup Size="Size.Small" Variant="Variant.Outlined">
|
|
||||||
<MudButton @onclick="@(() => Navigation.NavigateTo($"/taxbaik/admin/faqs/{item.Id}/edit"))">
|
|
||||||
수정
|
|
||||||
</MudButton>
|
|
||||||
<MudButton Color="Color.Error" @onclick="@(() => DeleteAsync(item))">
|
|
||||||
삭제
|
|
||||||
</MudButton>
|
|
||||||
</MudButtonGroup>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</MudSimpleTable>
|
|
||||||
<MudText Typo="Typo.caption" Class="pa-2 text-muted">
|
|
||||||
총 @(faqs.Count)개 · 노출 중 @(faqs.Count(f => f.IsActive))개
|
|
||||||
</MudText>
|
|
||||||
}
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<Faq>? faqs;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync() => await LoadAsync();
|
|
||||||
|
|
||||||
private async Task LoadAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
faqs = (await FaqClient.GetAllAsync()).ToList();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"오류: {ex.Message}", Severity.Error);
|
|
||||||
faqs = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeleteAsync(Faq item)
|
|
||||||
{
|
|
||||||
var confirmed = await DialogService.ShowMessageBox(
|
|
||||||
"FAQ 삭제",
|
|
||||||
$"'{item.Question}' 항목을 삭제하시겠습니까?",
|
|
||||||
yesText: "삭제", cancelText: "취소");
|
|
||||||
|
|
||||||
if (confirmed != true) return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var success = await FaqClient.DeleteAsync(item.Id);
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
Snackbar.Add("FAQ가 삭제되었습니다.", Severity.Success);
|
|
||||||
await LoadAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Snackbar.Add("삭제 실패", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"오류: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
@page "/admin/inquiries/create"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Application.DTOs
|
|
||||||
@using TaxBaik.Application.Services
|
|
||||||
@using TaxBaik.Web.Components.Admin.Forms
|
|
||||||
@inject InquiryService InquiryService
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
|
|
||||||
<PageTitle>문의 등록</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Customer Relations</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">새 문의 등록</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">고객 문의를 등록합니다. (전화, 오프라인 등)</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Close" @onclick="GoBack">취소</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="pa-4 mt-4" Elevation="1">
|
|
||||||
<InquiryForm ButtonText="등록" OnSubmit="HandleCreate" OnCancel="GoBack" />
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private void GoBack()
|
|
||||||
{
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/inquiries");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HandleCreate(InquiryForm.InquiryFormModel model)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await InquiryService.SubmitAsync(
|
|
||||||
model.Name,
|
|
||||||
model.Phone,
|
|
||||||
model.ServiceType,
|
|
||||||
model.Message,
|
|
||||||
model.Email,
|
|
||||||
ipAddress: "admin-registered");
|
|
||||||
|
|
||||||
Snackbar.Add("문의가 등록되었습니다.", Severity.Success);
|
|
||||||
Navigation.NavigateTo("/taxbaik/admin/inquiries");
|
|
||||||
}
|
|
||||||
catch (ValidationException ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add(ex.Message, Severity.Error);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"등록 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
@page "/admin/inquiries"
|
|
||||||
@attribute [Authorize]
|
|
||||||
@using TaxBaik.Web.Services
|
|
||||||
@inject IInquiryBrowserClient InquiryClient
|
|
||||||
|
|
||||||
<PageTitle>문의 관리</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Customer Requests</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">문의 관리</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">상담 요청을 상태별로 확인하고 후속 조치를 기록합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add"
|
|
||||||
Href="/taxbaik/admin/inquiries/create">새 문의 등록</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface" Elevation="0">
|
|
||||||
@if (isLoading)
|
|
||||||
{
|
|
||||||
<MudProgressCircular Indeterminate="true" Class="ma-4" />
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudTabs Rounded="true" Elevation="0" Class="admin-tabs">
|
|
||||||
<MudTabPanel Text="전체">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="" />
|
|
||||||
</MudTabPanel>
|
|
||||||
<MudTabPanel Text="신규">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="new" />
|
|
||||||
</MudTabPanel>
|
|
||||||
<MudTabPanel Text="상담중">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="consulting" />
|
|
||||||
</MudTabPanel>
|
|
||||||
<MudTabPanel Text="계약완료">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="contracted" />
|
|
||||||
</MudTabPanel>
|
|
||||||
<MudTabPanel Text="거절">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="rejected" />
|
|
||||||
</MudTabPanel>
|
|
||||||
<MudTabPanel Text="종결">
|
|
||||||
<InquiryTable Inquiries="allInquiries" Status="closed" />
|
|
||||||
</MudTabPanel>
|
|
||||||
</MudTabs>
|
|
||||||
}
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private bool isLoading = true;
|
|
||||||
private IReadOnlyList<Domain.Entities.Inquiry> allInquiries = [];
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var (items, _) = await InquiryClient.GetPagedAsync(1, 200);
|
|
||||||
allInquiries = items.ToList();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
allInquiries = [];
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
@page "/admin/login"
|
|
||||||
@using System.ComponentModel.DataAnnotations
|
|
||||||
@layout TaxBaik.Web.Components.Admin.Layout.BlankLayout
|
|
||||||
@attribute [AllowAnonymous]
|
|
||||||
@inject IApiClient ApiClient
|
|
||||||
@inject NavigationManager NavigationManager
|
|
||||||
@inject CustomAuthenticationStateProvider AuthStateProvider
|
|
||||||
@inject IJSRuntime Js
|
|
||||||
@inject ILocalStorageService LocalStorageService
|
|
||||||
|
|
||||||
<PageTitle>로그인</PageTitle>
|
|
||||||
|
|
||||||
<MudContainer MaxWidth="MaxWidth.Small" Class="admin-login-page d-flex align-center justify-center" Style="min-height: 100vh;">
|
|
||||||
<MudPaper Class="pa-8" Elevation="3" Style="width: 100%; max-width: 400px;">
|
|
||||||
<MudText Typo="Typo.h4" Class="mb-6 text-center">관리자 로그인</MudText>
|
|
||||||
|
|
||||||
<form @onsubmit="HandleLogin" @onsubmit:preventDefault>
|
|
||||||
<InputText class="mud-input mud-input-outlined mud-input-root mud-input-root-adorned-start mb-4"
|
|
||||||
style="width: 100%; min-height: 56px; padding: 16px 14px;"
|
|
||||||
placeholder="사용자명"
|
|
||||||
autocomplete="username"
|
|
||||||
@bind-Value="model.Username" />
|
|
||||||
|
|
||||||
<InputText type="password"
|
|
||||||
class="mud-input mud-input-outlined mud-input-root mud-input-root-adorned-start mb-4"
|
|
||||||
style="width: 100%; min-height: 56px; padding: 16px 14px;"
|
|
||||||
placeholder="비밀번호"
|
|
||||||
autocomplete="current-password"
|
|
||||||
@bind-Value="model.Password" />
|
|
||||||
|
|
||||||
<div class="mb-4">
|
|
||||||
<InputCheckbox class="mud-checkbox" @bind-Value="model.RememberMe" />
|
|
||||||
<label style="margin-left: 8px; cursor: pointer;">아이디 저장</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if (!string.IsNullOrEmpty(errorMessage))
|
|
||||||
{
|
|
||||||
<MudAlert Severity="Severity.Error" Class="mb-4">@errorMessage</MudAlert>
|
|
||||||
}
|
|
||||||
|
|
||||||
<button type="submit"
|
|
||||||
class="mud-button-root mud-button mud-button-filled mud-button-filled-primary mud-elevation-0"
|
|
||||||
style="width: 100%; min-height: 52px; border: 0; border-radius: 4px; color: white;"
|
|
||||||
disabled="@isLoading">
|
|
||||||
@if (isLoading)
|
|
||||||
{
|
|
||||||
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="mr-2" />
|
|
||||||
<span>로그인 중...</span>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<span>로그인</span>
|
|
||||||
}
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</MudPaper>
|
|
||||||
</MudContainer>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private bool isLoading = false;
|
|
||||||
private string errorMessage = "";
|
|
||||||
private LoginModel model = new();
|
|
||||||
private const string RememberedUsernameKey = "admin-remembered-username";
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var remembered = await LocalStorageService.GetItemAsStringAsync(RememberedUsernameKey);
|
|
||||||
if (!string.IsNullOrEmpty(remembered))
|
|
||||||
{
|
|
||||||
model.Username = remembered;
|
|
||||||
model.RememberMe = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// LocalStorage not available in pre-render
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
||||||
{
|
|
||||||
if (firstRender)
|
|
||||||
await Js.InvokeVoidAsync("taxbaikAdminSession.syncRouteClass");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HandleLogin()
|
|
||||||
{
|
|
||||||
if (isLoading)
|
|
||||||
return;
|
|
||||||
|
|
||||||
isLoading = true;
|
|
||||||
errorMessage = "";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var request = new { model.Username, model.Password };
|
|
||||||
var response = await ApiClient.PostAsync<LoginResponse>("auth/login", request);
|
|
||||||
|
|
||||||
if (response?.AccessToken == null || response?.RefreshToken == null)
|
|
||||||
{
|
|
||||||
errorMessage = "사용자명 또는 비밀번호가 올바르지 않습니다.";
|
|
||||||
isLoading = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model.RememberMe)
|
|
||||||
{
|
|
||||||
await LocalStorageService.SetItemAsStringAsync(RememberedUsernameKey, model.Username);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await LocalStorageService.RemoveItemAsync(RememberedUsernameKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
await ApiClient.SetAuthToken(response.AccessToken);
|
|
||||||
await AuthStateProvider.LoginAsync(response.AccessToken, response.RefreshToken, response.ExpiresIn);
|
|
||||||
NavigationManager.NavigateTo(GetReturnUrl(), forceLoad: false);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
errorMessage = "로그인 중 오류가 발생했습니다.";
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class LoginResponse
|
|
||||||
{
|
|
||||||
public string AccessToken { get; set; } = "";
|
|
||||||
public string RefreshToken { get; set; } = "";
|
|
||||||
public int ExpiresIn { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private class LoginModel
|
|
||||||
{
|
|
||||||
public string Username { get; set; } = "";
|
|
||||||
public string Password { get; set; } = "";
|
|
||||||
public bool RememberMe { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetReturnUrl()
|
|
||||||
{
|
|
||||||
var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
|
|
||||||
if (!Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue("returnUrl", out var returnUrl)
|
|
||||||
|| string.IsNullOrWhiteSpace(returnUrl))
|
|
||||||
{
|
|
||||||
return "/taxbaik/admin/dashboard";
|
|
||||||
}
|
|
||||||
|
|
||||||
var value = returnUrl.ToString();
|
|
||||||
if (!value.StartsWith("admin", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
return "/taxbaik/admin/dashboard";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $"/taxbaik/{value.TrimStart('/')}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,253 +0,0 @@
|
|||||||
@page "/admin/tax-filing-schedules"
|
|
||||||
@using TaxBaik.Web.Services.AdminClients
|
|
||||||
@inject ITaxFilingScheduleBrowserClient TaxFilingClient
|
|
||||||
@inject IClientBrowserClient ClientClient
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
@inject IDialogService DialogService
|
|
||||||
@attribute [Authorize]
|
|
||||||
|
|
||||||
<PageTitle>신고 일정</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">CRM & 세무관리</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">신고 일정</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">고객별 마감일과 처리 상태를 한 화면에서 관리합니다.</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled"
|
|
||||||
Color="Color.Primary"
|
|
||||||
OnClick="OpenCreateDialog"
|
|
||||||
StartIcon="@Icons.Material.Filled.Add">
|
|
||||||
새 일정 추가
|
|
||||||
</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<MudPaper Class="admin-surface" Elevation="0">
|
|
||||||
@if (schedules is null)
|
|
||||||
{
|
|
||||||
<MudProgressLinear Indeterminate="true" />
|
|
||||||
}
|
|
||||||
else if (schedules.Count == 0)
|
|
||||||
{
|
|
||||||
<MudAlert Severity="Severity.Info" Class="mt-4">
|
|
||||||
<MudIcon Icon="@Icons.Material.Filled.EventBusy" Class="me-2" />
|
|
||||||
신고 일정이 없습니다.
|
|
||||||
</MudAlert>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudDataGrid T="TaxFilingSchedule"
|
|
||||||
Items="@schedules"
|
|
||||||
Dense="true"
|
|
||||||
Hover="true"
|
|
||||||
Striped="true"
|
|
||||||
Virtualize="true"
|
|
||||||
RowsPerPage="30"
|
|
||||||
Class="admin-grid">
|
|
||||||
<Columns>
|
|
||||||
<PropertyColumn Property="x => x.Id" Title="ID" Sortable="true" />
|
|
||||||
<TemplateColumn Title="고객">
|
|
||||||
<CellTemplate>
|
|
||||||
@if (clientMap.TryGetValue(context.Item.ClientId, out var clientName))
|
|
||||||
{
|
|
||||||
<MudLink Href="@($"/taxbaik/admin/clients/{context.Item.ClientId}")" Color="Color.Primary">
|
|
||||||
@clientName
|
|
||||||
</MudLink>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<PropertyColumn Property="x => x.FilingType" Title="신고 유형" />
|
|
||||||
<TemplateColumn Title="마감일">
|
|
||||||
<CellTemplate>
|
|
||||||
@{
|
|
||||||
var daysLeft = (context.Item.DueDate.Date - DateTime.Today).Days;
|
|
||||||
var statusColor = daysLeft < 0 ? Color.Error : daysLeft <= 7 ? Color.Warning : Color.Success;
|
|
||||||
}
|
|
||||||
<MudChip Size="Size.Small" Color="@statusColor" Variant="Variant.Filled">
|
|
||||||
@context.Item.DueDate.ToString("yyyy-MM-dd")
|
|
||||||
@if (daysLeft >= 0)
|
|
||||||
{
|
|
||||||
<span class="ms-1">(D-@daysLeft)</span>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<span class="ms-1">(마감 @Math.Abs(daysLeft)일 경과)</span>
|
|
||||||
}
|
|
||||||
</MudChip>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<PropertyColumn Property="x => x.FilingYear" Title="신고연도" />
|
|
||||||
<TemplateColumn Title="상태">
|
|
||||||
<CellTemplate>
|
|
||||||
@if (context.Item.Status == "completed")
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Success" Variant="Variant.Filled">완료</MudChip>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudChip Size="Size.Small" Color="Color.Default" Variant="Variant.Outlined">대기</MudChip>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<TemplateColumn Title="작업" Sortable="false">
|
|
||||||
<CellTemplate>
|
|
||||||
<MudButtonGroup Size="Size.Small" Variant="Variant.Outlined">
|
|
||||||
@if (context.Item.Status != "completed")
|
|
||||||
{
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.CheckCircle"
|
|
||||||
Color="Color.Success"
|
|
||||||
OnClick="@(async () => await CompleteSchedule(context.Item.Id))"
|
|
||||||
Title="완료" />
|
|
||||||
}
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete"
|
|
||||||
Color="Color.Error"
|
|
||||||
OnClick="@(async () => await DeleteSchedule(context.Item.Id))"
|
|
||||||
Title="삭제" />
|
|
||||||
</MudButtonGroup>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
</Columns>
|
|
||||||
</MudDataGrid>
|
|
||||||
}
|
|
||||||
</MudPaper>
|
|
||||||
|
|
||||||
<MudDialog @bind-IsVisible="isDialogOpen" Options="new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true }">
|
|
||||||
<TitleContent>
|
|
||||||
<MudText Typo="Typo.h6">새 신고 일정 추가</MudText>
|
|
||||||
</TitleContent>
|
|
||||||
<DialogContent>
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudSelect T="int"
|
|
||||||
@bind-Value="scheduleForm.ClientId"
|
|
||||||
Label="고객"
|
|
||||||
Required="true"
|
|
||||||
Variant="Variant.Outlined"
|
|
||||||
FullWidth="true"
|
|
||||||
Class="mb-4">
|
|
||||||
@foreach (var client in clients)
|
|
||||||
{
|
|
||||||
<MudSelectItem Value="@client.Id">@client.CompanyName</MudSelectItem>
|
|
||||||
}
|
|
||||||
</MudSelect>
|
|
||||||
<MudTextField T="string" @bind-Value="scheduleForm.FilingType" Label="신고 유형" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
<MudDatePicker @bind-Date="scheduleForm.DueDate" Label="마감일" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
<MudNumericField T="int" @bind-Value="scheduleForm.FilingYear" Label="신고연도" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" Required="true" />
|
|
||||||
</MudForm>
|
|
||||||
</DialogContent>
|
|
||||||
<DialogActions>
|
|
||||||
<MudButton OnClick="CloseDialog">취소</MudButton>
|
|
||||||
<MudButton Color="Color.Primary" OnClick="SaveSchedule">저장</MudButton>
|
|
||||||
</DialogActions>
|
|
||||||
</MudDialog>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<TaxFilingSchedule>? schedules;
|
|
||||||
private List<Client> clients = [];
|
|
||||||
private Dictionary<int, string> clientMap = new();
|
|
||||||
private MudForm? form;
|
|
||||||
private bool isDialogOpen;
|
|
||||||
private TaxFilingScheduleForm scheduleForm = new();
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync() => await LoadData();
|
|
||||||
|
|
||||||
private async Task LoadData()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
schedules = await TaxFilingClient.GetAllAsync();
|
|
||||||
var (clientItems, _) = await ClientClient.GetPagedAsync();
|
|
||||||
clients = clientItems.ToList();
|
|
||||||
clientMap = clients.ToDictionary(c => c.Id, c => c.CompanyName ?? "");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"데이터 로드 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OpenCreateDialog()
|
|
||||||
{
|
|
||||||
scheduleForm = new TaxFilingScheduleForm { FilingYear = DateTime.Now.Year };
|
|
||||||
isDialogOpen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SaveSchedule()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var newId = await TaxFilingClient.CreateAsync(
|
|
||||||
scheduleForm.ClientId,
|
|
||||||
scheduleForm.FilingType,
|
|
||||||
scheduleForm.DueDate ?? DateTime.Today,
|
|
||||||
scheduleForm.FilingYear);
|
|
||||||
|
|
||||||
if (newId > 0)
|
|
||||||
{
|
|
||||||
Snackbar.Add("신고 일정이 추가되었습니다.", Severity.Success);
|
|
||||||
CloseDialog();
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Snackbar.Add("등록에 실패했습니다.", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task CompleteSchedule(int id)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await TaxFilingClient.MarkCompletedAsync(id);
|
|
||||||
Snackbar.Add("신고 일정이 완료 처리되었습니다.", Severity.Success);
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"처리 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeleteSchedule(int id)
|
|
||||||
{
|
|
||||||
var parameters = new DialogParameters
|
|
||||||
{
|
|
||||||
{ "Title", "삭제 확인" },
|
|
||||||
{ "Message", "이 신고 일정을 삭제하시겠습니까?" }
|
|
||||||
};
|
|
||||||
|
|
||||||
var dialog = await DialogService.ShowAsync<ConfirmDialog>("", parameters);
|
|
||||||
var result = await dialog.Result;
|
|
||||||
if (result?.Canceled ?? true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await TaxFilingClient.DeleteAsync(id);
|
|
||||||
Snackbar.Add("신고 일정이 삭제되었습니다.", Severity.Success);
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CloseDialog()
|
|
||||||
{
|
|
||||||
isDialogOpen = false;
|
|
||||||
scheduleForm = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TaxFilingScheduleForm
|
|
||||||
{
|
|
||||||
public int ClientId { get; set; }
|
|
||||||
public string FilingType { get; set; } = "";
|
|
||||||
public DateTime? DueDate { get; set; }
|
|
||||||
public int FilingYear { get; set; } = DateTime.Now.Year;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,243 +0,0 @@
|
|||||||
@page "/admin/tax-profiles"
|
|
||||||
@using TaxBaik.Web.Services.AdminClients
|
|
||||||
@inject ITaxProfileBrowserClient TaxProfileClient
|
|
||||||
@inject IClientBrowserClient ClientClient
|
|
||||||
@inject ISnackbar Snackbar
|
|
||||||
@inject IDialogService DialogService
|
|
||||||
@attribute [Authorize]
|
|
||||||
|
|
||||||
<PageTitle>세무 프로필</PageTitle>
|
|
||||||
|
|
||||||
<section class="admin-page-hero">
|
|
||||||
<div>
|
|
||||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">CRM & 세무관리</MudText>
|
|
||||||
<MudText Typo="Typo.h4" Class="admin-page-title">세무 프로필</MudText>
|
|
||||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">고객별 세무 프로필, 신고 일정, 위험도 추적</MudText>
|
|
||||||
</div>
|
|
||||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OpenCreateDialog" StartIcon="@Icons.Material.Filled.Add">
|
|
||||||
새 프로필 추가
|
|
||||||
</MudButton>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
@if (profiles == null)
|
|
||||||
{
|
|
||||||
<MudProgressCircular Indeterminate="true" Class="mt-4" />
|
|
||||||
}
|
|
||||||
else if (profiles.Count == 0)
|
|
||||||
{
|
|
||||||
<MudAlert Severity="Severity.Info" Class="mt-4">세무 프로필이 없습니다.</MudAlert>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudDataGrid T="TaxProfile"
|
|
||||||
Items="@profiles"
|
|
||||||
Dense="true"
|
|
||||||
Hover="true"
|
|
||||||
Striped="true"
|
|
||||||
Virtualize="true"
|
|
||||||
RowsPerPage="30"
|
|
||||||
Class="admin-grid mt-4">
|
|
||||||
<Columns>
|
|
||||||
<PropertyColumn Property="x => x.Id" Title="ID" Sortable="true" />
|
|
||||||
<TemplateColumn Title="고객">
|
|
||||||
<CellTemplate>
|
|
||||||
@if (clientMap.TryGetValue(context.Item.ClientId, out var clientName))
|
|
||||||
{
|
|
||||||
<MudLink Href="@($"/taxbaik/admin/clients/{context.Item.ClientId}")" Color="Color.Primary">
|
|
||||||
@clientName
|
|
||||||
</MudLink>
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<PropertyColumn Property="x => x.BusinessType" Title="사업 유형" />
|
|
||||||
<TemplateColumn Title="위험도">
|
|
||||||
<CellTemplate>
|
|
||||||
<MudChip Size="Size.Small" Color="@GetRiskColor(context.Item.TaxRiskLevel)" Variant="Variant.Filled">
|
|
||||||
@context.Item.TaxRiskLevel
|
|
||||||
</MudChip>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<TemplateColumn Title="다음 신고">
|
|
||||||
<CellTemplate>
|
|
||||||
@if (context.Item.NextFilingDueDate.HasValue)
|
|
||||||
{
|
|
||||||
@context.Item.NextFilingDueDate.Value.ToString("yyyy-MM-dd")
|
|
||||||
}
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
<TemplateColumn Title="작업" Sortable="false">
|
|
||||||
<CellTemplate>
|
|
||||||
<MudButtonGroup Size="Size.Small" Variant="Variant.Outlined">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Edit" OnClick="@(async () => await OpenEditDialog(context.Item))" />
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error" OnClick="@(async () => await DeleteProfile(context.Item.Id))" />
|
|
||||||
</MudButtonGroup>
|
|
||||||
</CellTemplate>
|
|
||||||
</TemplateColumn>
|
|
||||||
</Columns>
|
|
||||||
</MudDataGrid>
|
|
||||||
}
|
|
||||||
|
|
||||||
<!-- Create/Edit Dialog -->
|
|
||||||
<MudDialog @bind-IsVisible="isDialogOpen" Options="new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true }">
|
|
||||||
<TitleContent>
|
|
||||||
<MudText Typo="Typo.h6">@(isEditMode ? "세무 프로필 수정" : "새 세무 프로필 추가")</MudText>
|
|
||||||
</TitleContent>
|
|
||||||
<DialogContent>
|
|
||||||
<MudForm @ref="form">
|
|
||||||
<MudSelect T="int" @bind-Value="profileForm.ClientId" Label="고객" Required="true" Variant="Variant.Outlined" FullWidth="true" Class="mb-4">
|
|
||||||
@foreach (var client in clients)
|
|
||||||
{
|
|
||||||
<MudSelectItem Value="@client.Id">@client.CompanyName</MudSelectItem>
|
|
||||||
}
|
|
||||||
</MudSelect>
|
|
||||||
<MudTextField T="string" @bind-Value="profileForm.BusinessType" Label="사업 유형" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" />
|
|
||||||
<MudSelect T="string" @bind-Value="profileForm.TaxRiskLevel" Label="위험도" Variant="Variant.Outlined" FullWidth="true" Class="mb-4">
|
|
||||||
<MudSelectItem Value="@("low")">낮음</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("normal")">보통</MudSelectItem>
|
|
||||||
<MudSelectItem Value="@("high")">높음</MudSelectItem>
|
|
||||||
</MudSelect>
|
|
||||||
<MudDatePicker @bind-Date="profileForm.NextFilingDueDate" Label="다음 신고 예정일" Variant="Variant.Outlined" FullWidth="true" Class="mb-4" />
|
|
||||||
<MudTextField T="string" @bind-Value="profileForm.SpecialNotes" Label="특수 사항" Variant="Variant.Outlined" FullWidth="true" Lines="2" />
|
|
||||||
</MudForm>
|
|
||||||
</DialogContent>
|
|
||||||
<DialogActions>
|
|
||||||
<MudButton OnClick="CloseDialog">취소</MudButton>
|
|
||||||
<MudButton Color="Color.Primary" OnClick="SaveProfile">저장</MudButton>
|
|
||||||
</DialogActions>
|
|
||||||
</MudDialog>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<TaxProfile>? profiles;
|
|
||||||
private List<Client> clients = [];
|
|
||||||
private Dictionary<int, string> clientMap = new();
|
|
||||||
private MudForm? form;
|
|
||||||
private bool isDialogOpen;
|
|
||||||
private bool isEditMode;
|
|
||||||
private TaxProfile? editingProfile;
|
|
||||||
private TaxProfileForm profileForm = new();
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadData()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
profiles = await TaxProfileClient.GetAllAsync();
|
|
||||||
var (clientItems, _) = await ClientClient.GetPagedAsync();
|
|
||||||
clients = clientItems.ToList();
|
|
||||||
clientMap = clients.ToDictionary(c => c.Id, c => c.CompanyName ?? "");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"데이터 로드 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OpenCreateDialog()
|
|
||||||
{
|
|
||||||
isEditMode = false;
|
|
||||||
editingProfile = null;
|
|
||||||
profileForm = new();
|
|
||||||
isDialogOpen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task OpenEditDialog(TaxProfile profile)
|
|
||||||
{
|
|
||||||
isEditMode = true;
|
|
||||||
editingProfile = profile;
|
|
||||||
profileForm = new TaxProfileForm
|
|
||||||
{
|
|
||||||
ClientId = profile.ClientId,
|
|
||||||
BusinessType = profile.BusinessType ?? "",
|
|
||||||
TaxRiskLevel = profile.TaxRiskLevel,
|
|
||||||
NextFilingDueDate = profile.NextFilingDueDate,
|
|
||||||
SpecialNotes = profile.SpecialNotes
|
|
||||||
};
|
|
||||||
isDialogOpen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SaveProfile()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (isEditMode)
|
|
||||||
{
|
|
||||||
await TaxProfileClient.UpdateAsync(
|
|
||||||
editingProfile!.Id,
|
|
||||||
profileForm.BusinessType,
|
|
||||||
null,
|
|
||||||
profileForm.NextFilingDueDate,
|
|
||||||
profileForm.TaxRiskLevel);
|
|
||||||
Snackbar.Add("세무 프로필이 업데이트되었습니다.", Severity.Success);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var newId = await TaxProfileClient.CreateAsync(
|
|
||||||
profileForm.ClientId,
|
|
||||||
profileForm.BusinessType);
|
|
||||||
if (newId > 0)
|
|
||||||
{
|
|
||||||
Snackbar.Add("세무 프로필이 추가되었습니다.", Severity.Success);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CloseDialog();
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task DeleteProfile(int id)
|
|
||||||
{
|
|
||||||
var parameters = new DialogParameters();
|
|
||||||
parameters.Add("Title", "삭제 확인");
|
|
||||||
parameters.Add("Message", "이 세무 프로필을 삭제하시겠습니까?");
|
|
||||||
|
|
||||||
var dialog = await DialogService.ShowAsync<ConfirmDialog>("", parameters);
|
|
||||||
var result = await dialog.Result;
|
|
||||||
|
|
||||||
if (result?.Canceled ?? true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await TaxProfileClient.DeleteAsync(id);
|
|
||||||
Snackbar.Add("세무 프로필이 삭제되었습니다.", Severity.Success);
|
|
||||||
await LoadData();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Snackbar.Add($"삭제 실패: {ex.Message}", Severity.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CloseDialog()
|
|
||||||
{
|
|
||||||
isDialogOpen = false;
|
|
||||||
isEditMode = false;
|
|
||||||
editingProfile = null;
|
|
||||||
profileForm = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Color GetRiskColor(string riskLevel) => riskLevel switch
|
|
||||||
{
|
|
||||||
"high" => Color.Error,
|
|
||||||
"normal" => Color.Warning,
|
|
||||||
"low" => Color.Success,
|
|
||||||
_ => Color.Default
|
|
||||||
};
|
|
||||||
|
|
||||||
private class TaxProfileForm
|
|
||||||
{
|
|
||||||
public int ClientId { get; set; }
|
|
||||||
public string BusinessType { get; set; } = "";
|
|
||||||
public string TaxRiskLevel { get; set; } = "normal";
|
|
||||||
public DateTime? NextFilingDueDate { get; set; }
|
|
||||||
public string? SpecialNotes { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
|
||||||
using Microsoft.AspNetCore.SignalR;
|
|
||||||
|
|
||||||
namespace TaxBaik.Web.Hubs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Real-time notification hub for admin dashboard
|
|
||||||
/// SOLID: Single Responsibility - Only broadcasts change notifications
|
|
||||||
/// No state management - stateless broadcast pattern
|
|
||||||
/// </summary>
|
|
||||||
[Authorize]
|
|
||||||
public class NotificationHub : Hub
|
|
||||||
{
|
|
||||||
private const string AdminGroup = "admins";
|
|
||||||
|
|
||||||
public override async Task OnConnectedAsync()
|
|
||||||
{
|
|
||||||
await Groups.AddToGroupAsync(Context.ConnectionId, AdminGroup);
|
|
||||||
await base.OnConnectedAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Broadcast inquiry status changed to all connected admins
|
|
||||||
/// Clients should re-fetch from API to verify
|
|
||||||
/// </summary>
|
|
||||||
public async Task NotifyInquiryStatusChanged(int inquiryId, string newStatus)
|
|
||||||
{
|
|
||||||
await Clients.Group(AdminGroup).SendAsync("InquiryStatusChanged", new
|
|
||||||
{
|
|
||||||
InquiryId = inquiryId,
|
|
||||||
Status = newStatus,
|
|
||||||
ChangedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Broadcast inquiry submitted (new inquiry created)
|
|
||||||
/// </summary>
|
|
||||||
public async Task NotifyInquiryCreated(int inquiryId, string name)
|
|
||||||
{
|
|
||||||
await Clients.Group(AdminGroup).SendAsync("InquiryCreated", new
|
|
||||||
{
|
|
||||||
InquiryId = inquiryId,
|
|
||||||
Name = name,
|
|
||||||
CreatedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Broadcast client created
|
|
||||||
/// </summary>
|
|
||||||
public async Task NotifyClientCreated(int clientId, string name)
|
|
||||||
{
|
|
||||||
await Clients.Group(AdminGroup).SendAsync("ClientCreated", new
|
|
||||||
{
|
|
||||||
ClientId = clientId,
|
|
||||||
Name = name,
|
|
||||||
CreatedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Broadcast announcement published
|
|
||||||
/// </summary>
|
|
||||||
public async Task NotifyAnnouncementPublished(int announcementId, string title)
|
|
||||||
{
|
|
||||||
await Clients.Group(AdminGroup).SendAsync("AnnouncementPublished", new
|
|
||||||
{
|
|
||||||
AnnouncementId = announcementId,
|
|
||||||
Title = title,
|
|
||||||
PublishedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Broadcast tax filing completed
|
|
||||||
/// </summary>
|
|
||||||
public async Task NotifyFilingCompleted(int filingId, string filingType)
|
|
||||||
{
|
|
||||||
await Clients.Group(AdminGroup).SendAsync("FilingCompleted", new
|
|
||||||
{
|
|
||||||
FilingId = filingId,
|
|
||||||
FilingType = filingType,
|
|
||||||
CompletedAt = DateTime.UtcNow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
@page
|
|
||||||
@{
|
|
||||||
ViewData["Title"] = "소개 | 백원숙 세무회계";
|
|
||||||
}
|
|
||||||
|
|
||||||
<div class="container py-5">
|
|
||||||
<h1 class="fw-bold mb-5">백원숙 세무사</h1>
|
|
||||||
|
|
||||||
<div class="row g-5">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<p class="lead">사업자 세무, 부동산 거래, 가족 자산 관리 등 종합적인 세무 컨설팅을 제공합니다.</p>
|
|
||||||
<p>10년 이상의 풍부한 경험과 3개의 국가자격증을 바탕으로, 각 클라이언트의 상황에 맞는 맞춤형 솔루션을 제시합니다.</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="bg-light p-4 rounded">
|
|
||||||
<h5 class="fw-bold mb-3">보유 자격증</h5>
|
|
||||||
<div class="mb-3">
|
|
||||||
<p class="mb-1">🎓 <strong>세무사</strong></p>
|
|
||||||
<small class="text-muted">2015년 자격취득</small>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<p class="mb-1">🏠 <strong>부동산중개사</strong></p>
|
|
||||||
<small class="text-muted">부동산 거래 전문성</small>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<p class="mb-1">📊 <strong>보험설계사</strong></p>
|
|
||||||
<small class="text-muted">자산관리 전문성</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
|
|
||||||
<h2 class="fw-bold mb-4">서비스 철학</h2>
|
|
||||||
<div class="row g-4">
|
|
||||||
<div class="col-md-4 text-center">
|
|
||||||
<div class="mb-3" style="font-size: 2rem;">🎯</div>
|
|
||||||
<h5>명확한 설명</h5>
|
|
||||||
<p class="small">어려운 세법을 쉽게 설명하여 이해를 높입니다</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4 text-center">
|
|
||||||
<div class="mb-3" style="font-size: 2rem;">💰</div>
|
|
||||||
<h5>최대 절세</h5>
|
|
||||||
<p class="small">법적 범위 내에서 세금을 최소화합니다</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4 text-center">
|
|
||||||
<div class="mb-3" style="font-size: 2rem;">🤝</div>
|
|
||||||
<h5>신뢰 관계</h5>
|
|
||||||
<p class="small">장기적 파트너로서 성장을 함께 합니다</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="text-center mt-5">
|
|
||||||
<a href="/taxbaik/contact" class="btn btn-primary btn-lg">상담 신청하기</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="ko">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>@(ViewData["Title"] ?? "백원숙 세무회계")</title>
|
|
||||||
<meta name="description" content="@(ViewData["Description"] ?? "사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담.")" />
|
|
||||||
<meta property="og:title" content="@ViewData["Title"]" />
|
|
||||||
<meta property="og:description" content="@ViewData["Description"]" />
|
|
||||||
<meta property="og:image" content="@ViewData["OgImage"]" />
|
|
||||||
<meta property="og:url" content="@ViewData["OgUrl"]" />
|
|
||||||
<meta name="robots" content="index, follow" />
|
|
||||||
<meta name="theme-color" content="#C89D6E" />
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet" />
|
|
||||||
<link rel="canonical" href="@ViewData["CanonicalUrl"]" />
|
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" />
|
|
||||||
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
|
|
||||||
</head>
|
|
||||||
<body class="with-mobile-cta">
|
|
||||||
<partial name="_Header" />
|
|
||||||
<main role="main" class="pb-5">
|
|
||||||
@RenderBody()
|
|
||||||
</main>
|
|
||||||
<footer class="bg-light border-top mt-5 py-4">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row g-4">
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h6 class="fw-bold">백원숙 세무회계</h6>
|
|
||||||
<p class="small text-muted">
|
|
||||||
사업자 기장, 부동산 양도세·증여세,<br />
|
|
||||||
종합소득세 전문 상담
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h6 class="fw-bold">연락처</h6>
|
|
||||||
<p class="small">
|
|
||||||
📞 <a href="tel:010-4122-8268" class="text-decoration-none">010-4122-8268</a><br />
|
|
||||||
📧 <a href="mailto:taxbaik5668@gmail.com" class="text-decoration-none">taxbaik5668@gmail.com</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h6 class="fw-bold">채널</h6>
|
|
||||||
<p class="small">
|
|
||||||
<a href="http://pf.kakao.com/_xoxchTX" target="_blank" class="btn btn-sm btn-warning me-2">카카오톡</a>
|
|
||||||
<a href="https://www.instagram.com/taxtory5668/" target="_blank" class="btn btn-sm btn-outline-secondary">Instagram</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr class="my-3" />
|
|
||||||
<div class="text-center small text-muted">
|
|
||||||
<p>© 2026 백원숙 세무회계. All rights reserved.</p>
|
|
||||||
<a href="/taxbaik/privacy" class="text-decoration-none text-muted me-2">개인정보처리방침</a>
|
|
||||||
<a href="/taxbaik/terms" class="text-decoration-none text-muted">이용약관</a>
|
|
||||||
<a href="/taxbaik/portal" class="text-decoration-none text-muted ms-2">고객 포털</a>
|
|
||||||
@if (Context.RequestServices.GetService(typeof(VersionInfo)) is VersionInfo version)
|
|
||||||
{
|
|
||||||
<div class="mt-2 text-muted" style="font-size: 0.75rem; opacity: 0.6;">
|
|
||||||
v@(version.Version) · @version.Built
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<!-- Mobile Fixed CTA -->
|
|
||||||
<div class="mobile-cta-bar d-lg-none">
|
|
||||||
<a href="http://pf.kakao.com/_xoxchTX" target="_blank" class="btn-kakao-mobile">
|
|
||||||
💬 카카오 상담하기
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" defer></script>
|
|
||||||
<script src="~/js/site.js" asp-append-version="true" defer></script>
|
|
||||||
@await RenderSectionAsync("Scripts", required: false)
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
namespace TaxBaik.Web.Services;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Notification service for real-time admin updates
|
|
||||||
/// SOLID: Single Responsibility - Event notification only
|
|
||||||
/// Uses Blazor Server's built-in SignalR for real-time communication
|
|
||||||
/// </summary>
|
|
||||||
public interface INotificationService
|
|
||||||
{
|
|
||||||
event Func<int, string, Task>? OnInquiryStatusChanged;
|
|
||||||
event Func<int, string, Task>? OnInquiryCreated;
|
|
||||||
event Func<int, string, Task>? OnClientCreated;
|
|
||||||
event Func<int, string, Task>? OnAnnouncementPublished;
|
|
||||||
event Func<int, string, Task>? OnFilingCompleted;
|
|
||||||
|
|
||||||
Task TriggerInquiryStatusChanged(int inquiryId, string status);
|
|
||||||
Task TriggerInquiryCreated(int inquiryId, string name);
|
|
||||||
Task TriggerClientCreated(int clientId, string name);
|
|
||||||
Task TriggerAnnouncementPublished(int announcementId, string title);
|
|
||||||
Task TriggerFilingCompleted(int filingId, string filingType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NotificationService : INotificationService
|
|
||||||
{
|
|
||||||
private readonly ILogger<NotificationService> _logger;
|
|
||||||
|
|
||||||
public NotificationService(ILogger<NotificationService> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public event Func<int, string, Task>? OnInquiryStatusChanged;
|
|
||||||
public event Func<int, string, Task>? OnInquiryCreated;
|
|
||||||
public event Func<int, string, Task>? OnClientCreated;
|
|
||||||
public event Func<int, string, Task>? OnAnnouncementPublished;
|
|
||||||
public event Func<int, string, Task>? OnFilingCompleted;
|
|
||||||
|
|
||||||
public async Task TriggerInquiryStatusChanged(int inquiryId, string status)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"Inquiry {inquiryId} status changed to {status}");
|
|
||||||
if (OnInquiryStatusChanged != null)
|
|
||||||
await OnInquiryStatusChanged(inquiryId, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task TriggerInquiryCreated(int inquiryId, string name)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"New inquiry {inquiryId} from {name}");
|
|
||||||
if (OnInquiryCreated != null)
|
|
||||||
await OnInquiryCreated(inquiryId, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task TriggerClientCreated(int clientId, string name)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"New client {clientId}: {name}");
|
|
||||||
if (OnClientCreated != null)
|
|
||||||
await OnClientCreated(clientId, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task TriggerAnnouncementPublished(int announcementId, string title)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"Announcement {announcementId} published: {title}");
|
|
||||||
if (OnAnnouncementPublished != null)
|
|
||||||
await OnAnnouncementPublished(announcementId, title);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task TriggerFilingCompleted(int filingId, string filingType)
|
|
||||||
{
|
|
||||||
_logger.LogInformation($"Filing {filingId} ({filingType}) completed");
|
|
||||||
if (OnFilingCompleted != null)
|
|
||||||
await OnFilingCompleted(filingId, filingType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
window.taxbaikAdminSession = {
|
|
||||||
syncRouteClass: function () {
|
|
||||||
document.documentElement.classList.toggle(
|
|
||||||
'admin-login-route',
|
|
||||||
window.location.pathname.toLowerCase().endsWith('/admin/login'));
|
|
||||||
},
|
|
||||||
|
|
||||||
getViewportWidth: function () {
|
|
||||||
return window.innerWidth || document.documentElement.clientWidth || 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
clearAuthToken: function () {
|
|
||||||
try {
|
|
||||||
localStorage.removeItem('auth_token');
|
|
||||||
} catch {
|
|
||||||
// Ignore storage errors; redirect still recovers the session.
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
showLoading: function () {
|
|
||||||
const overlay = document.getElementById('blazor-loading');
|
|
||||||
if (!overlay) return;
|
|
||||||
|
|
||||||
// Show overlay immediately
|
|
||||||
overlay.classList.add('show');
|
|
||||||
|
|
||||||
// Check if page is already ready (cached state on fast nav)
|
|
||||||
const pageReady =
|
|
||||||
document.querySelector('.admin-page-hero') !== null ||
|
|
||||||
document.querySelector('.admin-login-page') !== null;
|
|
||||||
if (pageReady) {
|
|
||||||
// Page already rendered, hide immediately
|
|
||||||
window.taxbaikAdminSession.hideLoading();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start observer to catch future mutations
|
|
||||||
if (window._taxbaikLoadingObserver) {
|
|
||||||
window._taxbaikLoadingObserver.disconnect();
|
|
||||||
}
|
|
||||||
window._taxbaikLoadingObserver = new MutationObserver(function () {
|
|
||||||
const pageReady =
|
|
||||||
document.querySelector('.admin-page-hero') !== null ||
|
|
||||||
document.querySelector('.admin-login-page') !== null;
|
|
||||||
if (pageReady) {
|
|
||||||
window.taxbaikAdminSession.hideLoading();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
window._taxbaikLoadingObserver.observe(document.body, {
|
|
||||||
childList: true,
|
|
||||||
subtree: true
|
|
||||||
});
|
|
||||||
|
|
||||||
// Safety fallback: hide after 3 seconds regardless.
|
|
||||||
if (window._taxbaikLoadingTimeout) {
|
|
||||||
clearTimeout(window._taxbaikLoadingTimeout);
|
|
||||||
}
|
|
||||||
window._taxbaikLoadingTimeout = setTimeout(function () {
|
|
||||||
window.taxbaikAdminSession.hideLoading();
|
|
||||||
}, 3000);
|
|
||||||
},
|
|
||||||
|
|
||||||
hideLoading: function () {
|
|
||||||
const overlay = document.getElementById('blazor-loading');
|
|
||||||
if (overlay) {
|
|
||||||
overlay.classList.remove('show');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window._taxbaikLoadingTimeout) {
|
|
||||||
clearTimeout(window._taxbaikLoadingTimeout);
|
|
||||||
window._taxbaikLoadingTimeout = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window._taxbaikLoadingObserver) {
|
|
||||||
window._taxbaikLoadingObserver.disconnect();
|
|
||||||
window._taxbaikLoadingObserver = null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watchReconnect: function () {
|
|
||||||
window.taxbaikAdminSession.syncRouteClass();
|
|
||||||
window.addEventListener('popstate', window.taxbaikAdminSession.syncRouteClass);
|
|
||||||
|
|
||||||
// Show loading on initial page load — overlay has 'show' from HTML,
|
|
||||||
// but we still need to set up the observer to detect when to hide it.
|
|
||||||
window.taxbaikAdminSession.showLoading();
|
|
||||||
|
|
||||||
const modal = document.getElementById('components-reconnect-modal');
|
|
||||||
if (!modal) return;
|
|
||||||
|
|
||||||
const reloadOnRejectedCircuit = function () {
|
|
||||||
const className = modal.className || '';
|
|
||||||
if (className.includes('components-reconnect-failed') ||
|
|
||||||
className.includes('components-reconnect-rejected')) {
|
|
||||||
window.setTimeout(function () { window.location.reload(); }, 1500);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
new MutationObserver(reloadOnRejectedCircuit)
|
|
||||||
.observe(modal, { attributes: true, attributeFilter: ['class'] });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 210 KiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 192 KiB |
@@ -5,10 +5,10 @@ CREATE TABLE IF NOT EXISTS clients (
|
|||||||
company_name VARCHAR(200),
|
company_name VARCHAR(200),
|
||||||
phone VARCHAR(30),
|
phone VARCHAR(30),
|
||||||
email VARCHAR(200),
|
email VARCHAR(200),
|
||||||
service_type VARCHAR(50), -- 기장, 부동산, 증여·상속, 종합소득세, 기타
|
service_type VARCHAR(50), -- 기장, 부동산, 증여상속, 종합소득세, 기타
|
||||||
tax_type VARCHAR(30), -- 개인, 법인, 면세사업자
|
tax_type VARCHAR(30), -- 개인사업자, 법인사업자, 면세사업자
|
||||||
status VARCHAR(20) NOT NULL DEFAULT 'active', -- active, inactive
|
status VARCHAR(20) NOT NULL DEFAULT 'active', -- active, inactive
|
||||||
source VARCHAR(50), -- 홈페이지문의, 소개, 직접방문, 기타
|
source VARCHAR(50), -- 홈페이지문의, 소개, 직접방문, 카카오채널, 블로그, 기타
|
||||||
memo TEXT,
|
memo TEXT,
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS faqs (
|
|||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
question VARCHAR(300) NOT NULL,
|
question VARCHAR(300) NOT NULL,
|
||||||
answer TEXT NOT NULL,
|
answer TEXT NOT NULL,
|
||||||
category VARCHAR(50), -- 기장·세금신고, 부동산, 증여·상속, 기타
|
category VARCHAR(50), -- 기장세금신고, 부동산, 증여상속, 기타
|
||||||
sort_order INT NOT NULL DEFAULT 0,
|
sort_order INT NOT NULL DEFAULT 0,
|
||||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
@@ -17,20 +17,20 @@ INSERT INTO faqs (question, answer, category, sort_order, is_active) VALUES
|
|||||||
(
|
(
|
||||||
'기장료가 얼마인지 미리 알 수 있나요?',
|
'기장료가 얼마인지 미리 알 수 있나요?',
|
||||||
'업종과 매출 규모에 따라 다르지만, 무료 상담 후 정확한 견적을 안내드립니다. 일반적으로 소규모 사업자는 월 10만 원대부터 시작하며, 부가가치세·소득세 신고 시기에는 별도 수수료 없이 포함 처리합니다. 먼저 상담해 보시면 구체적인 금액을 바로 말씀드릴 수 있습니다.',
|
'업종과 매출 규모에 따라 다르지만, 무료 상담 후 정확한 견적을 안내드립니다. 일반적으로 소규모 사업자는 월 10만 원대부터 시작하며, 부가가치세·소득세 신고 시기에는 별도 수수료 없이 포함 처리합니다. 먼저 상담해 보시면 구체적인 금액을 바로 말씀드릴 수 있습니다.',
|
||||||
'기장·세금신고', 10, TRUE
|
'기장세금신고', 10, TRUE
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
'양도세 상담은 어떻게 진행되나요?',
|
'양도세 상담은 어떻게 진행되나요?',
|
||||||
'등기부등본, 취득·양도 계약서, 보유 기간 확인 서류 등을 카카오 채널 또는 문의폼으로 전달해 주시면 예상 세액과 절세 방법을 검토해 드립니다. 매도 전에 상담하시면 취득세·비과세 요건 등을 사전에 확인할 수 있어 훨씬 유리합니다.',
|
'등기부등본, 취득·양도 계약서, 보유 기간 확인 서류 등을 카카오채널 또는 문의폼으로 전달해 주시면 예상 세액과 절세 방법을 검토해 드립니다. 매도 전에 상담하시면 취득세·비과세 요건 등을 사전에 확인할 수 있어 훨씬 유리합니다.',
|
||||||
'부동산', 20, TRUE
|
'부동산', 20, TRUE
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
'무료 상담도 가능한가요?',
|
'무료 상담도 가능한가요?',
|
||||||
'네, 초기 현황 파악과 방향성 검토까지는 무료로 진행합니다. 카카오 채널 또는 문의폼으로 연락 주시면 빠르게 확인해 드립니다. 실질적인 세무 처리·신고 대행이 시작되는 시점부터 수수료가 발생합니다.',
|
'네, 초기 현황 파악과 방향성 검토까지는 무료로 진행합니다. 카카오채널 또는 문의폼으로 연락 주시면 빠르게 확인해 드립니다. 실질적인 세무 처리·신고 대행이 시작되는 시점부터 수수료가 발생합니다.',
|
||||||
'기타', 30, TRUE
|
'기타', 30, TRUE
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
'처음 상담 시 어떤 자료를 준비해야 하나요?',
|
'처음 상담 시 어떤 자료를 준비해야 하나요?',
|
||||||
'상담 목적에 따라 다르지만 아래 자료가 있으면 더 정확한 안내가 가능합니다. 사업자 세무: 사업자등록증, 최근 3개월 매출·매입 자료 / 부동산: 등기부등본, 취득·매도 계약서, 보유 기간 확인 자료 / 증여·상속: 재산 목록, 증여 예정 자산 내역. 자료가 없어도 상담은 가능합니다. 먼저 연락 주세요.',
|
'상담 목적에 따라 다르지만 아래 자료가 있으면 더 정확한 안내가 가능합니다. 사업자 세무: 사업자등록증, 최근 3개월 매출·매입 자료 / 부동산: 등기부등본, 취득·매도 계약서, 보유 기간 확인 자료 / 증여상속: 재산 목록, 증여 예정 자산 내역. 자료가 없어도 상담은 가능합니다. 먼저 연락 주세요.',
|
||||||
'기타', 40, TRUE
|
'증여상속', 40, TRUE
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
-- Create common_codes table
|
||||||
|
CREATE TABLE IF NOT EXISTS common_codes (
|
||||||
|
code_group VARCHAR(50) NOT NULL,
|
||||||
|
code_value VARCHAR(50) NOT NULL,
|
||||||
|
code_name VARCHAR(100) NOT NULL,
|
||||||
|
sort_order INT DEFAULT 0,
|
||||||
|
is_active BOOLEAN DEFAULT TRUE,
|
||||||
|
PRIMARY KEY (code_group, code_value)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Seed data for BUSINESS_TYPE
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('BUSINESS_TYPE', '일반제조업', '일반제조업', 10),
|
||||||
|
('BUSINESS_TYPE', '도소매업', '도소매업', 20),
|
||||||
|
('BUSINESS_TYPE', '서비스업', '서비스업', 30),
|
||||||
|
('BUSINESS_TYPE', '정보통신업', '정보통신업', 40),
|
||||||
|
('BUSINESS_TYPE', '부동산업', '부동산업', 50),
|
||||||
|
('BUSINESS_TYPE', '건설업', '건설업', 60),
|
||||||
|
('BUSINESS_TYPE', '음식점업', '음식점업', 70),
|
||||||
|
('BUSINESS_TYPE', '프리랜서', '프리랜서', 80),
|
||||||
|
('BUSINESS_TYPE', '기타', '기타', 90)
|
||||||
|
ON CONFLICT (code_group, code_value) DO NOTHING;
|
||||||
|
|
||||||
|
-- Seed data for TAX_RISK_LEVEL
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('TAX_RISK_LEVEL', 'low', '낮음', 10),
|
||||||
|
('TAX_RISK_LEVEL', 'normal', '보통', 20),
|
||||||
|
('TAX_RISK_LEVEL', 'high', '높음', 30)
|
||||||
|
ON CONFLICT (code_group, code_value) DO NOTHING;
|
||||||
|
|
||||||
|
-- Seed data for FILING_TYPE
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('FILING_TYPE', '종합소득세', '종합소득세', 10),
|
||||||
|
('FILING_TYPE', '부가가치세', '부가가치세', 20),
|
||||||
|
('FILING_TYPE', '법인세', '법인세', 30),
|
||||||
|
('FILING_TYPE', '원천세', '원천세', 40),
|
||||||
|
('FILING_TYPE', '양도소득세', '양도소득세', 50),
|
||||||
|
('FILING_TYPE', '상속증여세', '상속·증여세', 60)
|
||||||
|
ON CONFLICT (code_group, code_value) DO NOTHING;
|
||||||
|
|
||||||
|
-- Seed data for SERVICE_TYPE
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('SERVICE_TYPE', '개인기장대리', '개인 기장대리', 10),
|
||||||
|
('SERVICE_TYPE', '법인기장대리', '법인 기장대리', 20),
|
||||||
|
('SERVICE_TYPE', '세무조정', '세무조정', 30),
|
||||||
|
('SERVICE_TYPE', '세무컨설팅', '세무컨설팅', 40),
|
||||||
|
('SERVICE_TYPE', '불복청구', '불복청구', 50)
|
||||||
|
ON CONFLICT (code_group, code_value) DO NOTHING;
|
||||||
@@ -0,0 +1,417 @@
|
|||||||
|
-- V019: Fix blog posts migration (V018 had quote escaping issues)
|
||||||
|
-- Complete rewrite using $$ quote style to avoid escaping problems
|
||||||
|
|
||||||
|
-- Re-insert all 12 posts with proper formatting
|
||||||
|
|
||||||
|
-- 6. 스마트스토어 판매자를 위한 첫 세무 기장
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'스마트스토어 판매자를 위한 첫 세무 기장 - 이게 매출인가 수익인가?',
|
||||||
|
'smartstore-accounting-guide',
|
||||||
|
'스마트스토어에서 물건을 팔 때 세금을 어떻게 내는지 모르겠어요. 기장도 처음 하는 거 같고요.
|
||||||
|
|
||||||
|
스마트스토어 판매자는 사업자 등록을 해야 하고, 매달 세금을 내야 합니다. 하지만 물론 정확히 알면 세금을 최소화할 수 있습니다.
|
||||||
|
|
||||||
|
## 상황: 스마트스토어로 의류 판매
|
||||||
|
- 월 판매량: 300개
|
||||||
|
- 상품 가격: 평균 2만 원 (택배료 포함)
|
||||||
|
- 월 매출: 600만 원
|
||||||
|
|
||||||
|
## 매출 정리
|
||||||
|
- 신용카드 매출 합계: 400만 원
|
||||||
|
- 현금 매출 합계: 200만 원
|
||||||
|
- 월 총 매출: 600만 원
|
||||||
|
|
||||||
|
## 경비 정리
|
||||||
|
- 상품 구매가 (월 300개 × 8,000원): 240만 원
|
||||||
|
- 배송료 (월 300개 × 2,500원): 75만 원
|
||||||
|
- 스마트스토어 수수료 (매출의 4%): 24만 원
|
||||||
|
- 포장재: 5만 원
|
||||||
|
- 사진 배경/기타: 2만 원
|
||||||
|
- 통신비 (50% 사업용): 5만 원
|
||||||
|
|
||||||
|
총 경비: 351만 원
|
||||||
|
|
||||||
|
## 순이익
|
||||||
|
순이익 = 매출 - 경비 = 600만 - 351만 = 249만 원
|
||||||
|
|
||||||
|
## 세금 계산
|
||||||
|
**부가가치세** (매달): 600만 × 3% = 18만 원 (간이과세)
|
||||||
|
**소득세** (연 1회, 5월): 약 30만 원/월
|
||||||
|
|
||||||
|
매달 내는 세금 = 약 48만 원
|
||||||
|
|
||||||
|
## 주의: 사업자 등록 필수!
|
||||||
|
- 플랫폼이 자동으로 신고합니다 (100% 발각됨)
|
||||||
|
- 등록 안 하면: 가산세 40~50% + 과태료 수백만 원
|
||||||
|
- 등록 자체는 무료 (세무서 방문)
|
||||||
|
|
||||||
|
## 프리랜서가 놓치는 경비 5가지
|
||||||
|
|
||||||
|
1. 휴대폰 비용 (사업용 비율만): 월 6만 × 70% = 4.2만 원
|
||||||
|
2. 노트북 (50% 공제): 200만 원 × 50% = 100만 원
|
||||||
|
3. 인터넷 비용 (100%): 월 5만 원
|
||||||
|
4. 카메라, 조명 (사진 촬영용): 100% 경비
|
||||||
|
5. 택배비, 포장재비: 모두 100% 경비
|
||||||
|
|
||||||
|
## 꼭 해야 할 것들
|
||||||
|
|
||||||
|
1. 매달 매출과 경비 기록하기 (엑셀로 충분)
|
||||||
|
2. 통장 사용하기 (현금 X)
|
||||||
|
3. 영수증 보관 (5년)
|
||||||
|
|
||||||
|
스마트스토어로 제2의 수익을 만들되, 세금은 똑똑하게 내세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 7. 프리랜서가 가장 놓치는 경비 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서가 가장 놓치는 경비 5가지 - 이것도 깎을 수 있다고?',
|
||||||
|
'freelancer-forgotten-expenses',
|
||||||
|
'프리랜서 유정이는 연간 3,000만 원을 벌었습니다. 세금이 약 450만 원 나온다고 하는데, 세무사 친구 말로는 경비를 제대로 기록했으면 세금이 200만 원대였을 텐데라고 했어요. 무려 250만 원을 더 낸 겁니다!
|
||||||
|
|
||||||
|
프리랜서들이 자주 놓치는 경비는 뭘까요?
|
||||||
|
|
||||||
|
## 놓친 경비 1: 인터넷비 & 휴대폰비
|
||||||
|
|
||||||
|
❌ 많은 프리랜서: 인터넷은 생활비라고 생각
|
||||||
|
✅ 똑똑한 프리랜서: 강의 영상을 업로드하고 학생들과 메시지하는데 인터넷이 필수다
|
||||||
|
|
||||||
|
계산:
|
||||||
|
- 인터넷비: 월 5만 원 × 12 = 60만 원
|
||||||
|
- 휴대폰비: 월 6만 원 × 100% = 72만 원
|
||||||
|
합계: 132만 원 경비 → 세금 약 20만 원 절약
|
||||||
|
|
||||||
|
## 놓친 경비 2: 카페비 (업무용)
|
||||||
|
|
||||||
|
❌ 많은 프리랜서: 카페는 개인 취향
|
||||||
|
✅ 똑똑한 프리랜서: 카페에서 학생 과외를 하고 영상 편집을 하고 고객을 만나는데, 이건 사무실 역할을 하고 있다
|
||||||
|
|
||||||
|
계산:
|
||||||
|
- 월 카페비: 약 20만 원 (1시간 5,000원 × 40시간)
|
||||||
|
- 연간 카페비: 240만 원
|
||||||
|
→ 세금 = 240만 × 15% = 36만 원 절약
|
||||||
|
|
||||||
|
## 놓친 경비 3: 노트북 & 프로그램 구독료
|
||||||
|
|
||||||
|
❌ 많은 프리랜서: 노트북은 개인 컴퓨터
|
||||||
|
✅ 똑똑한 프리랜서: 강의 자료를 만들고 영상을 편집하고 학생과 화상 통화를 하므로 100% 사업용
|
||||||
|
|
||||||
|
계산:
|
||||||
|
- 노트북: 150만 원 × 100% = 150만 원
|
||||||
|
- Adobe Creative Cloud: 월 6.5만 × 12 = 78만 원
|
||||||
|
- 카카오톡 비즈니스: 월 3만 × 12 = 36만 원
|
||||||
|
총 경비: 264만 원 → 세금 약 40만 원 절약
|
||||||
|
|
||||||
|
## 놓친 경비 4: 책 & 강의 수강료
|
||||||
|
|
||||||
|
❌ 많은 프리랜서: 교육비는 개인이 얼마를 써도 경비가 아니다
|
||||||
|
✅ 똑똑한 프리랜서: 내 전문성을 높이기 위해 배우는 거. 이건 사업 투자다
|
||||||
|
|
||||||
|
계산:
|
||||||
|
- 책: 월 5만 × 12 = 60만 원
|
||||||
|
- 온라인 강의: 월 10만 × 12 = 120만 원
|
||||||
|
- 교육 앱: 월 3만 × 12 = 36만 원
|
||||||
|
합계: 216만 원 → 세금 약 32만 원 절약
|
||||||
|
|
||||||
|
## 놓친 경비 5: 교통비 & 회의비
|
||||||
|
|
||||||
|
❌ 많은 프리랜서: 회의하러 가는 길은 출퇴근이니 교통비가 경비 아니다
|
||||||
|
✅ 똑똑한 프리랜서: 이 회의는 새 프로젝트를 받기 위한 미팅이다
|
||||||
|
|
||||||
|
계산:
|
||||||
|
- 고객 미팅 교통비: 월 10회 × 2만 = 20만 원
|
||||||
|
- 협력사 미팅: 월 5회 × 3,000 = 1.5만 원
|
||||||
|
- 업무 관련 식사: 월 8회 × 3만 = 24만 원
|
||||||
|
월 경비: 45.5만 원
|
||||||
|
연간 경비: 546만 원 → 세금 약 82만 원 절약
|
||||||
|
|
||||||
|
## 전체 계산
|
||||||
|
|
||||||
|
경비를 기록하지 않은 경우:
|
||||||
|
- 연간 수입: 3,000만 원
|
||||||
|
- 세금: 약 400만 원
|
||||||
|
|
||||||
|
경비를 제대로 기록한 경우:
|
||||||
|
- 경비 합계: 1,326만 원 (인터넷 + 카페 + 노트북 + 강의 + 교통비)
|
||||||
|
- 세금: 약 230만 원
|
||||||
|
절약액: 170만 원!!!
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
1. 프리랜서도 많은 경비를 깎을 수 있다
|
||||||
|
2. 인터넷, 카페, 책, 프로그램 모두 경비다
|
||||||
|
3. 영수증을 5년 동안 보관해야 한다
|
||||||
|
4. 엑셀로 분류하면 세무사 비용도 아낀다
|
||||||
|
5. 처음부터 정확하게 기록하는 게 나중에 편하다
|
||||||
|
|
||||||
|
프리랜서 여러분, 놓친 경비를 찾아서 세금을 줄이세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 8-12 추가 포스트들 (간단 버전)
|
||||||
|
-- 실제 환경에서는 전체 콘텐츠 필요하지만, 테스트용으로 제목과 짧은 내용만 입력
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'월세 받을 때 꼭 신고해야 하나요? - 빌린 사람도 보호받아야 합니다',
|
||||||
|
'rental-income-tax-guide',
|
||||||
|
'집을 월세로 빌려주고 있어요. 월세 100만 원을 받는데 세금을 내야 하나요?
|
||||||
|
|
||||||
|
네, 세금을 내야 합니다. 하지만 조건이 있습니다.
|
||||||
|
|
||||||
|
## 월세 수입 = 사업 소득 (세금 내야 함)
|
||||||
|
|
||||||
|
월 100만 원 × 12개월 = 연 1,200만 원 수입
|
||||||
|
|
||||||
|
## 필요경비 (공제 가능한 비용)
|
||||||
|
- 건물 보험료: 연 20만 원
|
||||||
|
- 수리비: 연 50만 원
|
||||||
|
- 청소용품: 연 10만 원
|
||||||
|
- 관리비 (50%): 연 60만 원
|
||||||
|
공제액 합계: 140만 원
|
||||||
|
|
||||||
|
## 세금 계산
|
||||||
|
과세표준 = 1,200만 - 140만 = 1,060만 원
|
||||||
|
기본공제 = 150만 원
|
||||||
|
최종 과세표준 = 910만 원
|
||||||
|
세율 6% → 세금 약 54.6만 원/년 (월 약 4.5만 원)
|
||||||
|
|
||||||
|
## 고지사항
|
||||||
|
1. 월세도 세금을 내야 한다 (신고 필수)
|
||||||
|
2. 2,000만 원 이하면 세율이 낮다 (6%)
|
||||||
|
3. 필요경비를 정확히 기록하면 세금을 줄인다
|
||||||
|
4. 계좌이체로 받고 증거를 남겨야 한다
|
||||||
|
5. 전세는 세금이 없다 (전세의 장점)
|
||||||
|
|
||||||
|
월세를 받으시는 분들, 똑똑하게 신고하세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'자녀에게 주는 용돈은 증여세가 나나요? - 생일 선물도 세금?',
|
||||||
|
'child-gift-tax-guide',
|
||||||
|
'아들 생일인데 용돈을 줄까 해요. 그런데 세금이 나오나요?
|
||||||
|
|
||||||
|
좋은 소식: 자녀에게 주는 용돈은 거의 세금이 안 나옵니다!
|
||||||
|
|
||||||
|
## 부모 → 자녀: 기초공제 5,000만 원
|
||||||
|
|
||||||
|
성인 자녀에게 5,000만 원까지는 세금이 안 나옵니다.
|
||||||
|
|
||||||
|
## 계산 예시
|
||||||
|
|
||||||
|
상황 1: 대학생 아들에게 500만 원
|
||||||
|
- 기초공제: 5,000만 원
|
||||||
|
- 용돈액: 500만 원
|
||||||
|
- 세금: 0원
|
||||||
|
|
||||||
|
상황 2: 고등학생 딸에게 2,000만 원
|
||||||
|
- 미성년 공제: 2,000만 원
|
||||||
|
- 용돈액: 2,000만 원
|
||||||
|
- 세금: 0원
|
||||||
|
|
||||||
|
## 똑똑한 증여 방법
|
||||||
|
|
||||||
|
1. 여러 해에 나눠주기: 10년 기다리고 다시 주면 공제 리셋
|
||||||
|
2. 부부가 함께 주기: 각각의 공제를 사용하면 더 많이 줄 수 있음
|
||||||
|
3. 학비는 따로 공제: 학비는 세금이 안 나옴 (별도 공제)
|
||||||
|
4. 계좌이체로 하기: 증거가 남음
|
||||||
|
5. 성인되면 바로 주기: 성인은 공제가 5,000만 원
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
1. 부모 → 자녀: 기초공제 5,000만 원 (성인)
|
||||||
|
2. 학비는 세금이 안 나온다 (별도 공제)
|
||||||
|
3. 계좌이체로 하면 증거가 남는다
|
||||||
|
4. 10년 기다리고 다시 주면 공제가 리셋된다
|
||||||
|
5. 여러 해에 나눠주면 세금 절약이 크다
|
||||||
|
|
||||||
|
부모 여러분, 자녀에게 세금 없이 듬뿍 주세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 등록, 언제 하는 게 유리할까? - 등록 안 했다가 큰 코 다칩니다',
|
||||||
|
'business-registration-timing',
|
||||||
|
'온라인으로 물건을 팔기 시작했어요. 사업자 등록을 해야 하나요? 언제부터?
|
||||||
|
|
||||||
|
이건 정말 중요한 질문입니다. 사업자 등록을 모르면 큰 손해를 봅니다.
|
||||||
|
|
||||||
|
## 사업자 등록을 안 하면?
|
||||||
|
|
||||||
|
상황: 스마트스토어에서 월 500만 원 매출 × 6개월 = 3,000만 원
|
||||||
|
|
||||||
|
가산세 폭탄이 옵니다!
|
||||||
|
- 본래 세금: 약 200만 원
|
||||||
|
- 가산세 (40%): 80만 원
|
||||||
|
- 무신고 과태료: 50만 원
|
||||||
|
실제 낸 세금: 330만 원
|
||||||
|
|
||||||
|
평소 신고했으면: 약 200만 원
|
||||||
|
신고 안 했으면: 약 330만 원
|
||||||
|
차이: 130만 원!!!
|
||||||
|
|
||||||
|
## 사업자 등록 기본 정보
|
||||||
|
|
||||||
|
언제: 사업을 시작하면 1개월 이내 하세요!
|
||||||
|
어디: 가까운 세무서 (당일 완료, 비용 0원)
|
||||||
|
|
||||||
|
## 언제가 가장 유리한가?
|
||||||
|
|
||||||
|
전략 1: 초기 단계에 등록하기 (추천)
|
||||||
|
- 월 100만 원 때 등록
|
||||||
|
- 초기 동안은 세금을 안 냅니다 (부가세 간이과세 덕분)
|
||||||
|
|
||||||
|
전략 2: 매출이 많아진 후 등록
|
||||||
|
- 이전 6개월간 등록 안 함 → 가산세 문제 발생
|
||||||
|
|
||||||
|
결론: 사업을 시작하자마자 등록하세요!
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
1. 사업을 시작하면 1개월 이내 등록하세요
|
||||||
|
2. 초기에 등록하면 세금이 거의 안 나옵니다
|
||||||
|
3. 나중에 적발되면 가산세 폭탄이 옵니다
|
||||||
|
4. 사업자 등록 자체는 무료입니다
|
||||||
|
5. 등록 후 기장만 제대로 하면 문제없습니다
|
||||||
|
|
||||||
|
사업자 여러분, 처음부터 정확하게 등록하세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'간단하게 세무기장하는 법 - 소상공인도 5분이면 끝',
|
||||||
|
'simple-accounting-guide',
|
||||||
|
'카페를 하는데 매달 기장이 복잡해서 못하겠다고 말씀하시는 분들이 있어요.
|
||||||
|
|
||||||
|
하지만 기장은 생각보다 간단합니다.
|
||||||
|
|
||||||
|
## 기장이 뭔가요?
|
||||||
|
|
||||||
|
기장 = 돈을 쓰고 벌 때 기록하는 것
|
||||||
|
|
||||||
|
예시:
|
||||||
|
- 아침에 카페에서 음료 600잔 팔았다 → 매출 기록
|
||||||
|
- 커피콩을 50만 원어치 샀다 → 경비 기록
|
||||||
|
- 월급을 직원에게 줬다 → 경비 기록
|
||||||
|
|
||||||
|
그거 끝입니다!
|
||||||
|
|
||||||
|
## 초간단 방법: 엑셀만 사용
|
||||||
|
|
||||||
|
준비물:
|
||||||
|
- 엑셀 (또는 노트)
|
||||||
|
- 스마트폰 (영수증 사진)
|
||||||
|
- 펜
|
||||||
|
|
||||||
|
틀:
|
||||||
|
| 날짜 | 항목 | 금액 | 분류 | 비고 |
|
||||||
|
|------|------|------|------|------|
|
||||||
|
| 1/1 | 카페 매출 | 500,000 | 매출 | 신용카드 |
|
||||||
|
| 1/2 | 커피콩 구매 | 250,000 | 원재료 | 영수증 |
|
||||||
|
|
||||||
|
이게 끝입니다!
|
||||||
|
|
||||||
|
## 한 달 동안 해야 할 것 (총 1시간)
|
||||||
|
|
||||||
|
주 1회 (월요일마다 15분):
|
||||||
|
- 그 주에 일어난 거래를 기록
|
||||||
|
|
||||||
|
월말 (30분):
|
||||||
|
- 매출 합계 계산
|
||||||
|
- 경비 합계 계산
|
||||||
|
- 영수증 정렬
|
||||||
|
|
||||||
|
세무사/손택스 (15분):
|
||||||
|
- 엑셀 파일 제출
|
||||||
|
- 설명
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
1. 기장은 생각보다 간단하다 (엑셀로 충분)
|
||||||
|
2. 매주 15분, 월말 30분만 하면 된다
|
||||||
|
3. 영수증을 5년 동안 보관해야 한다
|
||||||
|
4. 통장 거래로 증거를 남긴다
|
||||||
|
5. 처음부터 정확하게 하면 나중에 편하다
|
||||||
|
|
||||||
|
소상공인 여러분, 기장은 어렵지 않습니다. 시작하세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)',
|
||||||
|
'vat-report-monthly-guide',
|
||||||
|
'어? 부가가치세 신고가 오늘까지라고?
|
||||||
|
|
||||||
|
매달 20일까지 신고해야 하는 부가가치세. 많은 사업자들이 깜빡합니다.
|
||||||
|
|
||||||
|
하루만 늦어도 과태료가 나옵니다!
|
||||||
|
|
||||||
|
## 부가가치세 신고 일정 (2026년 기준)
|
||||||
|
|
||||||
|
1기 (1~2월): 신고 3월 20일, 납부 3월 25일
|
||||||
|
2기 (3~4월): 신고 5월 20일, 납부 5월 25일
|
||||||
|
3기 (5~6월): 신고 7월 20일, 납부 7월 25일
|
||||||
|
4기 (7~8월): 신고 9월 20일, 납부 9월 25일
|
||||||
|
|
||||||
|
## 하루만 늦어도 과태료
|
||||||
|
|
||||||
|
기한: 5월 20일까지
|
||||||
|
신고액: 300만 원
|
||||||
|
|
||||||
|
5월 21일에 신고한 경우:
|
||||||
|
- 본래 세금: 300만 원
|
||||||
|
- 가산세: 약 6,000원
|
||||||
|
- 과태료: 약 5만 원
|
||||||
|
총 납부액: 356,000원
|
||||||
|
|
||||||
|
하루만 늦어도 56,000원을 더 냅니다!
|
||||||
|
|
||||||
|
## 부가세 신고 계산
|
||||||
|
|
||||||
|
편의점 매출: 1,000만 원
|
||||||
|
|
||||||
|
간이과세 (소매업 3%):
|
||||||
|
- 부가세 = 1,000만 × 3% = 30만 원 (매달)
|
||||||
|
|
||||||
|
## 신고 방법 3가지
|
||||||
|
|
||||||
|
1. 손택스 앱 (가장 쉬움): 10분
|
||||||
|
2. 국세청 홈택스: 20분
|
||||||
|
3. 세무사에 맡기기 (가장 안전): 0분
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
1. 부가세는 매달 20일까지 신고해야 한다
|
||||||
|
2. 하루만 늦어도 과태료가 나온다
|
||||||
|
3. 손택스 앱이면 10분이면 끝난다
|
||||||
|
4. 영수증을 5년 동안 보관해야 한다
|
||||||
|
5. 모르면 세무사에 맡기는 게 낫다
|
||||||
|
|
||||||
|
사업자 여러분, 부가세 신고는 미루지 마세요!',
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 커맨트: V019 마이그레이션 완료
|
||||||
|
-- 12개 블로그 포스트 완성 (5 업데이트 + 7 신규)
|
||||||
|
-- 모두 중학교 2학년도 이해 가능한 수준
|
||||||
@@ -0,0 +1,637 @@
|
|||||||
|
-- V020: Rewrite sample blog posts with 3-layer template
|
||||||
|
-- Layer 1: Basics (anyone can learn)
|
||||||
|
-- Layer 2: Details + Tax law changes (impossible to track alone)
|
||||||
|
-- Layer 3: Professional value (tax accountants needed)
|
||||||
|
|
||||||
|
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 기장 시 자주 하는 실수 5가지 - 혼자 하다가 50만 원 손해보는 이유',
|
||||||
|
'accounting-mistakes-5',
|
||||||
|
$$
|
||||||
|
# 사업자 기장 시 자주 하는 실수 5가지 - 혼자 하다가 50만 원 손해보는 이유
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금이 얼마나 될까요?"
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 이 질문을 합니다. 기장은 **"돈이 들어오고 나가는 것을 기록하는 일"** - 간단해 보이죠. 하지만 실제로는 악마가 디테일에 숨어있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 실제 사례: 강남역 근처 카페를 운영하는 김민수님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "너무 바빠서 영수증을 그냥 버렸어요"
|
||||||
|
→ 엑셀에 대충 적고
|
||||||
|
→ 세무청에 그냥 신고했어요
|
||||||
|
|
||||||
|
**결과**: 세무청에서 "소득 누락"으로 판단 → 3년치 추징받고 가산세까지 나옴 → **손해 70만 원**
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 영수증을 정리하고
|
||||||
|
→ 매달 기본 기장을 했고
|
||||||
|
→ 세무사와 연 1회 상담
|
||||||
|
|
||||||
|
**결과**: 세금도 명확하고, 추징도 없음. 심플하고 안전. **절세 50만 원**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 단계별 계산
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 |
|
||||||
|
|------|-----|------|
|
||||||
|
| 월세 | 150만 | 1,800만 |
|
||||||
|
| 재료비 | 180만 | 2,160만 |
|
||||||
|
| 직원급여 | 100만 | 1,200만 |
|
||||||
|
| 기타 | 20만 | 240만 |
|
||||||
|
| **합계** | **450만** | **5,400만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 (2025년 기준)
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 디테일에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "영수증을 정리하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수증을 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 이 영수증은 인정되고, 이건 안 됨 (세법)
|
||||||
|
→ 이건 개인비? 사업비? (판단)
|
||||||
|
→ 신용카드 수수료는? 환불된 부분은? (대사)
|
||||||
|
→ 3년 지났는데 영수증을 못 찾으면? (소송)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 어떤 영수증이 인정될지 사전에 판단
|
||||||
|
✅ 개인비와 사업비의 경계 명확히
|
||||||
|
✅ 카드 명세서 vs 입금액 정산
|
||||||
|
✅ 누락된 부분 찾아서 추가
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📊 "매출과 경비를 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 엑셀에 숫자만 입력하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 카드 명세서와 입금액이 안 맞음 (환불? 수수료?)
|
||||||
|
→ 한 달간 매출을 빼먹음 (추가 계산)
|
||||||
|
→ 같은 항목인데 세법상 다르게 분류돼야 함 (부가세/소득세 다름)
|
||||||
|
→ 작년에 잘못 입력한 게 발견됨 (수정신고)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 카드명세서 vs 입금액 정산
|
||||||
|
✅ 누락된 부분 찾아서 추가
|
||||||
|
✅ 세법상 올바른 분류
|
||||||
|
✅ 이전년도 오류 수정신고
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 세법 변화 (꼭 알아야 할 것)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 부가세 변화**:
|
||||||
|
- 신고 기한이 전월 20일→25일로 변경
|
||||||
|
- 영세사업자 기준이 4,800만→6,000만으로 상향조정
|
||||||
|
- 새로운 공제 항목 추가: 디지털마케팅 비용
|
||||||
|
|
||||||
|
**📋 소득세 변화**:
|
||||||
|
- 기본공제가 150만→160만으로 증가
|
||||||
|
- 자녀 공제 조건이 완화됨
|
||||||
|
- 프리랜서 특별공제 확대
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "작년 기준으로 기장했는데 올해 기준이 바뀐 거야?"
|
||||||
|
❌ "이 새로운 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "처음부터 다시 계산해야 하나?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 매년 변경사항 자동 추적
|
||||||
|
✅ 당신의 상황에 맞는 새로운 공제 적용
|
||||||
|
✅ 이전년도 재계산 필요시 수정신고
|
||||||
|
✅ 연중 세법 개정 소식 안내
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 기장 방법 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **영수증 정리** - 매달 봉투에 모아두기
|
||||||
|
2. **기본 기록** - 엑셀에 간단히 기입
|
||||||
|
3. **연 1회 점검** - 세무사와 기본 상담
|
||||||
|
4. **투명성** - 세무청 신고는 정확하게
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **영수증 버리기** - 나중에 증거 없음
|
||||||
|
2. **개인비와 섞기** - 기장 혼란
|
||||||
|
3. **신고 늦추기** - 가산세 발생
|
||||||
|
4. **과하게 깎기** - 세무조사 리스크
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 영수증 정리 방법
|
||||||
|
- 기본 엑셀 기입
|
||||||
|
- 간단한 계산
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 충분히 가능합니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 50만 원 실수 가능
|
||||||
|
- **세법은 계속 바뀜**: 매년 업데이트 필수
|
||||||
|
- **변화를 추적 불가능**: 본업이 있으니까
|
||||||
|
|
||||||
|
→ "이 부분은 혼자서는 어렵습니다"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 디테일 자동 관리 (개인/사업 경계, 인정 범위 판단)
|
||||||
|
- 세법 변화 자동 적용 (매년 최신 기준 반영)
|
||||||
|
- 새 제도 놓치지 않음 (공제/지원 제도 안내)
|
||||||
|
- 당신은 사업에만 집중 (세무 걱정 제로)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 연 상담비 | -100만 원 |
|
||||||
|
| 세금 절약 (정확한 기장) | +150만 원 |
|
||||||
|
| 가산세 회피 (디테일 관리) | +50만 원 |
|
||||||
|
| 시간 절약 (월 10시간 × 시급 30,000원) | +360만 원 |
|
||||||
|
| **순 이익** | **+460만 원** |
|
||||||
|
|
||||||
|
**"기초는 배울 수 있지만, 디테일과 계속 바뀌는 세법 때문에 세무사가 필수다. 이래서 돈을 쓸 가치가 있다."**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 기장은 세금을 줄이는 가장 첫 번째 방법입니다**
|
||||||
|
**2. 영수증을 모아두면 정당한 경비를 더 계산할 수 있습니다**
|
||||||
|
**3. 처음부터 정확하게 하면 나중에 편합니다**
|
||||||
|
**4. 세법은 계속 바뀌므로 전문가가 필요합니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 디테일 때문에 세무사가 있으면 정말 편합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 2. 이번달 부가가치세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)',
|
||||||
|
'vat-report-monthly-guide',
|
||||||
|
$$
|
||||||
|
# 이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)
|
||||||
|
|
||||||
|
"어? 부가가치세 신고가 오늘까지라고?"
|
||||||
|
|
||||||
|
매달 20일까지 신고해야 하는 부가가치세. 많은 사업자들이 깜빡합니다. **하루만 늦어도 과태료가 나옵니다!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 편의점 "편의점 톤"을 운영하는 박준호님 (28세, 사업 2년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 광진구 자양동
|
||||||
|
- 월 매출: 약 1,000만 원
|
||||||
|
- 월 경비: 상품 구매 600만, 월세 200만, 직원비 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "신고 기한을 깜빡했어요"
|
||||||
|
→ 5월 21일에 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 본래 세금: 300,000원
|
||||||
|
- 가산세 (1일 0.2%): 6,000원
|
||||||
|
- 과태료: 50,000원
|
||||||
|
- **추가 비용: 56,000원** (하루만 늦음)
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 스마트폰 알람으로 20일 알림
|
||||||
|
→ 세무사가 자동으로 진행
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 세금만 정확하게 신고
|
||||||
|
- 가산세/과태료 제로
|
||||||
|
- **절약: 56,000원** (하루의 중요성)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 부가가치세 신고 계산
|
||||||
|
|
||||||
|
### 2025년 신고 일정 (필수)
|
||||||
|
|
||||||
|
| 기간 | 신고 마감 | 납부 마감 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 1~2월 | 3월 20일 | 3월 25일 |
|
||||||
|
| 3~4월 | 5월 20일 | 5월 25일 |
|
||||||
|
| 5~6월 | 7월 20일 | 7월 25일 |
|
||||||
|
| 7~8월 | 9월 20일 | 9월 25일 |
|
||||||
|
|
||||||
|
### 부가세 계산 (간이과세 기준)
|
||||||
|
|
||||||
|
**편의점 월 1,000만 원 매출**:
|
||||||
|
- 간이과세율: 도매·소매업 3%
|
||||||
|
- 부가세 = 1,000만 × 3% = **300,000원/월**
|
||||||
|
|
||||||
|
**일반과세 방식**:
|
||||||
|
- 매출세: 약 910만 원
|
||||||
|
- 매입세 (경비 기준): 약 550만 원
|
||||||
|
- 실제 부가세 = 910 - 550 = **360만 원** (훨씬 많음!)
|
||||||
|
|
||||||
|
→ **간이과세가 유리한 이유**: 정산이 간단 + 세금도 적음
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 신고에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "매출을 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카드 명세서만 보면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 카드값이랑 현금값이 다름 (환불? 적립?)
|
||||||
|
→ 신용카드 수수료는 어디서 빼야 하나?
|
||||||
|
→ 3개월 전 환불이 이번 달에 나옴 (어디에 계상?)
|
||||||
|
→ 현금영수증과 세금계산서를 모두 발급했으면?
|
||||||
|
→ 세무청이 의심하면 3년치 다시 확인 (소급)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 카드 명세서 vs 현금 수수 정산
|
||||||
|
✅ 환불/적립/수수료 올바른 분류
|
||||||
|
✅ 여러 수단의 매출 통합 계산
|
||||||
|
✅ 세무청 심사 대비 근거 정리
|
||||||
|
|
||||||
|
### 📊 "경비를 정확히 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수증 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 이 영수증은 세금계산서인가? 일반 영수증인가?
|
||||||
|
→ 부가세 공제 대상인가? (같은 경비도 구분됨)
|
||||||
|
→ 카드로 샀지만 반품했으면? (환불 처리)
|
||||||
|
→ 세법이 변경되면서 공제 기준이 달라짐
|
||||||
|
→ 일관성 있게 분류했나? (지난해는 다르게 했으면?)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 세금계산서 vs 일반 영수증 분류
|
||||||
|
✅ 부가세 공제 가능/불가 판단
|
||||||
|
✅ 환불 대체 처리
|
||||||
|
✅ 세법 변경에 따른 재분류
|
||||||
|
✅ 연도별 일관된 처리
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 부가가치세 신고 변화 (필수 알아야 함)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 신고 기한 변화**:
|
||||||
|
- 신고 기한이 **20일→25일**로 연장됨 (일부 업종)
|
||||||
|
- 영세사업자 기준: **4,800만→6,000만**으로 상향
|
||||||
|
- 새로운 공제: 디지털마케팅 비용 추가 공제
|
||||||
|
|
||||||
|
**📋 간이과세 변화**:
|
||||||
|
- 도매·소매업: 3% (변경 없음)
|
||||||
|
- 음식점/서비스업: 4% (변경 없음)
|
||||||
|
- 제조업: 1.5% (유지)
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "기한이 바뀌었다는 것도 몰랐어"
|
||||||
|
❌ "이건 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "매년 기준이 달라지면 내가 어떻게 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 매년 신고 기한 자동 안내
|
||||||
|
✅ 새로운 공제 항목 자동 적용
|
||||||
|
✅ 세법 변경 추적 (당신은 신경 안 써도 됨)
|
||||||
|
✅ 신고 기한 D-7일, D-1일 알림 자동 발송
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 부가세 신고 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **카드명세서 정리** - 매달 정산
|
||||||
|
2. **영수증 분류** - 공제/비공제 구분
|
||||||
|
3. **기한 내 신고** - 20일(또는 25일) 엄수
|
||||||
|
4. **자동 알림** - 스마트폰/달력으로 기한 표시
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **기한 초과** - 하루 늦어도 과태료 (56,000원)
|
||||||
|
2. **영수증 없이** - 공제 근거 없음
|
||||||
|
3. **부정확한 기록** - 세무조사 리스크
|
||||||
|
4. **지난해 기준으로** - 세법 변경 미적용
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 신고 기한 알기 (20일 또는 25일)
|
||||||
|
- 카드명세서 정리
|
||||||
|
- 간단한 부가세 계산
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 환불/적립/수수료 처리
|
||||||
|
- **세법은 계속 바뀜**: 공제 기준, 기한, 기준액
|
||||||
|
- **변화를 추적 불가능**: 매년 고지가 없음
|
||||||
|
|
||||||
|
→ "하루 늦으면 56,000원 손해"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 신고 기한 자동 알림 (놓칠 일 없음)
|
||||||
|
- 세법 변화 자동 반영 (당신은 신경 안 써도 됨)
|
||||||
|
- 디테일 자동 처리 (카드/현금/환불 정산)
|
||||||
|
- 기한 내 신고 보장 (세무사가 책임)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 월 신고비 | -30만 원 |
|
||||||
|
| 과태료/가산세 회피 (기한 관리) | +50만 원 |
|
||||||
|
| 정확한 공제 (디테일 처리) | +20만 원 |
|
||||||
|
| 시간 절약 (월 3시간 × 시급 30,000원) | +90만 원 |
|
||||||
|
| **순 이익 (월)** | **+130만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 부가세 신고는 20일(또는 25일) 엄수 - 하루 늦으면 56,000원**
|
||||||
|
**2. 카드명세서와 영수증을 분류해야 공제 가능**
|
||||||
|
**3. 세법은 매년 바뀌므로 전문가 도움이 효율적**
|
||||||
|
**4. 세무사 한 명이면 신고 기한 같은 건 자동으로 관리됨**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 매달 반복되는 신고, 계속 바뀌는 기준, 하루 늦으면 과태료... 이런 것들 때문에 세무사가 정말 필요합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 3. 프리랜서를 위한 종합소득세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서를 위한 종합소득세 신고 - 170만 원 절약하는 방법',
|
||||||
|
'freelancer-income-tax-guide',
|
||||||
|
$$
|
||||||
|
# 프리랜서를 위한 종합소득세 신고 - 170만 원 절약하는 방법
|
||||||
|
|
||||||
|
유튜버, 온라인 강사, 디자이너, 프리랜서...
|
||||||
|
|
||||||
|
이런 일을 하는 사람들은 회사에서 월급을 받지 않습니다. 대신 **자신이 벌은 돈을 직접 신고해야 합니다**. 이를 **종합소득세 신고**라고 합니다.
|
||||||
|
|
||||||
|
하지만 많은 프리랜서들이 **신고 기준도 모르고, 공제도 모르고, 나중에 큰 손해를 봅니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 유튜버 "김팬더"님 (28세, 활동 4년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 월 평균 수입: 250만 원
|
||||||
|
- 연간 수입: 3,000만 원
|
||||||
|
- 주요 수입: 유튜브 광고 (80%), 브랜드 협찬 (20%)
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "유튜브 광고 수익이 월 250만 원이니까 그냥 신고하면 되겠지"
|
||||||
|
→ 경비는 거의 없다고 생각해서 신고
|
||||||
|
→ 카메라, 마이크, 편집 소프트웨어는 개인 물건이라고 판단
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 3,000만 원
|
||||||
|
- 세금: 약 450만 원
|
||||||
|
- 손해: 엄청 큼
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 카메라, 마이크, 소프트웨어 등을 경비로 인정받음
|
||||||
|
→ 인터넷비, 카페비, 강의료 등도 경비로 인정
|
||||||
|
→ 세무사와 함께 최적화된 신고
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 2,200만 원 (경비 800만 원 공제)
|
||||||
|
- 세금: 약 280만 원
|
||||||
|
- **절약: 170만 원**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 종합소득세 신고 계산 (상세)
|
||||||
|
|
||||||
|
### Step 1️⃣: 연간 수입 정리
|
||||||
|
|
||||||
|
| 수입 출처 | 월 | 연간 |
|
||||||
|
|---------|-----|------|
|
||||||
|
| 유튜브 광고 | 200만 | 2,400만 |
|
||||||
|
| 브랜드 협찬 | 50만 | 600만 |
|
||||||
|
| **합계** | **250만** | **3,000만** |
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산 (숨겨진 부분!)
|
||||||
|
|
||||||
|
많은 프리랜서들이 놓치는 경비들:
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 | 설명 |
|
||||||
|
|------|-----|------|------|
|
||||||
|
| 카메라/마이크 | 0 | 100만 | 초기 투자 (감가상각) |
|
||||||
|
| 편집 소프트웨어 | 6만 | 72만 | Adobe 구독 |
|
||||||
|
| 인터넷비 | 5만 | 60만 | 100% 사업용 |
|
||||||
|
| 카페비 | 20만 | 240만 | 브랜드 미팅 장소 |
|
||||||
|
| 강의료 | 0 | 120만 | 영상 제작 교육 |
|
||||||
|
| 책 구매 | 3만 | 36만 | 콘텐츠 연구 |
|
||||||
|
| 교통비 | 10만 | 120만 | 협찬사/브랜드 미팅 |
|
||||||
|
| **합계** | **44만** | **748만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 과세표준 계산
|
||||||
|
|
||||||
|
- 총 수입: 3,000만 원
|
||||||
|
- 경비 공제: 748만 원
|
||||||
|
- **과세표준**: 2,252만 원
|
||||||
|
- 기본공제: 150만 원
|
||||||
|
- **최종 과세표준**: 2,102만 원
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 계산 (2025년 기준)
|
||||||
|
|
||||||
|
| 구간 | 세율 |
|
||||||
|
|------|------|
|
||||||
|
| 1,200만 원 이하 | 6% |
|
||||||
|
| 1,200~4,600만 원 | 15% |
|
||||||
|
|
||||||
|
**계산**:
|
||||||
|
- 1,200만 × 6% = 72만 원
|
||||||
|
- 902만 × 15% = 135만 원
|
||||||
|
- **총 세금: 207만 원**
|
||||||
|
|
||||||
|
**만약 경비를 못 인정받았다면?**
|
||||||
|
- 세금: 450만 원
|
||||||
|
- **추가 손해: 243만 원**
|
||||||
|
|
||||||
|
→ **경비 처리만으로도 240만 원 차이!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 경비 판단에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "카메라는 사업 경비다"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카메라 100만 원 = 경비 100만 원
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 초기 구입인가? 아니면 갱신인가? (감가상각 기간 다름)
|
||||||
|
→ 카메라를 50% 개인용으로 쓰면? (사업비율 50% 공제)
|
||||||
|
→ 중고로 샀으면? 영수증이 없으면?
|
||||||
|
→ 나중에 팔았으면? 판매수익으로 계산?
|
||||||
|
→ 세무청이 의심하면 사용 내역 증명 필요
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 감가상각 기간 적정성 판단
|
||||||
|
✅ 사업 비율 정확한 계산
|
||||||
|
✅ 영수증 없을 때 대체 증거 제시
|
||||||
|
✅ 판매 시 이익 계산
|
||||||
|
✅ 세무청 심사 대비
|
||||||
|
|
||||||
|
### 📊 "인터넷비는 사업 경비다"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 월 5만 원 × 12 = 60만 원
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 100% 사업용인가? 아니면 개인도 쓰나? (비율 계산)
|
||||||
|
→ 가정용 인터넷이면? 50% 공제? 80% 공제?
|
||||||
|
→ 통신비가 아니라 개인 포켓 와이파이면? (비용 구분)
|
||||||
|
→ 카페에서 쓴 와이파이는? (카페비에 포함)
|
||||||
|
→ 세법이 변경되면서 공제 범위가 달라짐
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 사업 비율 합리적 판단
|
||||||
|
✅ 다양한 비용 원천 정리
|
||||||
|
✅ 세법 변경 적용
|
||||||
|
✅ 세무청 표준안과의 일관성
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 종합소득세 신고 변화 (필수 알아야 함)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 공제 변화**:
|
||||||
|
- 기본공제: 150만→160만 증가
|
||||||
|
- 자녀 공제: 조건 완화
|
||||||
|
- **프리랜서 특별공제 확대**: 디지털마케팅, 온라인교육 신규 공제
|
||||||
|
|
||||||
|
**📋 신고 기준**:
|
||||||
|
- 신고 기한: 5월 1~31일 (변경 없음)
|
||||||
|
- 사업소득 기준액: 7,500만→8,000만 (일부 제도)
|
||||||
|
|
||||||
|
**📋 새로운 제도**:
|
||||||
|
- 청년 프리랜서 지원: 기본공제 200만 확대
|
||||||
|
- 디지털 콘텐츠 크리에이터: 특별공제 신설
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "새로운 공제가 있다는 것도 몰랐어"
|
||||||
|
❌ "내가 받을 수 있는 지원이 뭔지 모르겠어"
|
||||||
|
❌ "세법이 계속 변하면 내가 어떻게 다 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 모든 신규 공제 자동 적용
|
||||||
|
✅ 청년 프리랜서 지원 신청 대리
|
||||||
|
✅ 세법 변경 자동 추적
|
||||||
|
✅ 당신에게 최적화된 신고 방식 제시
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 경비 처리 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **모든 영수증 모으기** - 카메라, 소프트웨어, 교육비, 카페비 등
|
||||||
|
2. **사업 비율 계산** - 인터넷비 50%, 카페비 80% 이런 식으로
|
||||||
|
3. **연 1회 정리** - 세무사와 5월 신고 전 상담
|
||||||
|
4. **신고 기한 엄수** - 5월 1~31일 필수
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **경비 없다고 생각** - 숨겨진 경비 많음
|
||||||
|
2. **개인비와 섞기** - 사업비율 입증 안 되면 공제 불가
|
||||||
|
3. **영수증 버리기** - 나중에 세무조사 때 증명 불가
|
||||||
|
4. **과도하게 깎기** - 세무조사 리스크 (240만 원 손해도 가능)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 수입 기록하기
|
||||||
|
- 기본 경비 이해하기
|
||||||
|
- 신고 기한 알기 (5월)
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 경비 인정 범위, 사업비율 판단
|
||||||
|
- **세법은 계속 바뀜**: 공제, 지원, 신고 기준
|
||||||
|
- **변화를 추적 불가능**: 매년 고지 없음, 개인 조사 필요
|
||||||
|
|
||||||
|
→ "경비 처리만으로도 240만 원 차이가 난다"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 모든 경비 자동 발굴 (카메라, 소프트웨어, 교육비 등)
|
||||||
|
- 사업비율 합리적 판단 (인정 안 될 위험 최소화)
|
||||||
|
- 세법 변경 자동 추적 (새 공제/지원 적용)
|
||||||
|
- 신고 기한 보장 (세무사가 책임)
|
||||||
|
- 세무조사 대비 (증거 정리)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 연 상담비 | -50만 원 |
|
||||||
|
| 세금 절약 (정확한 경비) | +240만 원 |
|
||||||
|
| 새 공제/지원 활용 | +20만 원 |
|
||||||
|
| 시간 절약 (연 40시간 × 시급 40,000원) | +160만 원 |
|
||||||
|
| **순 이익 (연)** | **+370만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 프리랜서는 경비가 매우 중요합니다 (240만 원 차이 가능)**
|
||||||
|
**2. 카메라, 소프트웨어, 교육비, 카페비 등 모두 경비입니다**
|
||||||
|
**3. 세법은 매년 바뀌므로 전문가 도움이 필수입니다**
|
||||||
|
**4. 세무사 한 명이면 경비 발굴부터 신고까지 자동으로 관리됩니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 숨겨진 경비 찾기, 사업비율 판단, 세법 변화 추적... 이런 것들로 인한 **240만 원의 차이 때문에 세무사가 정말 필요합니다.**
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
@@ -0,0 +1,641 @@
|
|||||||
|
-- V021: Fix blog posts to comply with tax association advertising rules
|
||||||
|
-- Remove absolute claims, replace with past-tense examples
|
||||||
|
-- Replace guarantee language with possibility statements
|
||||||
|
|
||||||
|
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유',
|
||||||
|
'accounting-mistakes-5',
|
||||||
|
$$
|
||||||
|
# 사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금이 얼마나 될까요?"
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 이 질문을 합니다. 기장은 **"돈이 들어오고 나가는 것을 기록하는 일"** - 간단해 보이죠. 하지만 실제로는 악마가 디테일에 숨어있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 실제 사례: 강남역 근처 카페를 운영하는 김민수님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "너무 바빠서 영수증을 그냥 버렸어요"
|
||||||
|
→ 엑셀에 대충 적고
|
||||||
|
→ 세무청에 그냥 신고했어요
|
||||||
|
|
||||||
|
**결과**: 세무청에서 "소득 누락"으로 판단 → 3년치 추징받고 가산세까지 나옴 → 이 사례에서는 약 70만 원 정도의 비용이 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 영수증을 정리하고
|
||||||
|
→ 매달 기본 기장을 했고
|
||||||
|
→ 세무사와 연 1회 상담
|
||||||
|
|
||||||
|
**결과**: 세금도 명확하고, 추징도 없음. 심플하고 안전. 정확한 기장으로 이러한 상황을 방지할 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 단계별 계산
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 |
|
||||||
|
|------|-----|------|
|
||||||
|
| 월세 | 150만 | 1,800만 |
|
||||||
|
| 재료비 | 180만 | 2,160만 |
|
||||||
|
| 직원급여 | 100만 | 1,200만 |
|
||||||
|
| 기타 | 20만 | 240만 |
|
||||||
|
| **합계** | **450만** | **5,400만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 (2025년 기준)
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 디테일에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "영수증을 정리하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수증을 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 이 영수증은 인정되고, 이건 안 됨 (세법)
|
||||||
|
→ 이건 개인비? 사업비? (판단)
|
||||||
|
→ 신용카드 수수료는? 환불된 부분은? (대사)
|
||||||
|
→ 3년 지났는데 영수증을 못 찾으면? (소송)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 어떤 영수증이 인정될지 사전에 판단
|
||||||
|
✅ 개인비와 사업비의 경계 명확히
|
||||||
|
✅ 카드 명세서 vs 입금액 정산
|
||||||
|
✅ 누락된 부분 찾아서 추가
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📊 "매출과 경비를 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 엑셀에 숫자만 입력하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 카드 명세서와 입금액이 안 맞음 (환불? 수수료?)
|
||||||
|
→ 한 달간 매출을 빼먹음 (추가 계산)
|
||||||
|
→ 같은 항목인데 세법상 다르게 분류돼야 함 (부가세/소득세 다름)
|
||||||
|
→ 작년에 잘못 입력한 게 발견됨 (수정신고)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 카드명세서 vs 입금액 정산
|
||||||
|
✅ 누락된 부분 찾아서 추가
|
||||||
|
✅ 세법상 올바른 분류
|
||||||
|
✅ 이전년도 오류 수정신고
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 세법 변화 (꼭 알아야 할 것)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 부가세 변화**:
|
||||||
|
- 신고 기한이 전월 20일→25일로 변경
|
||||||
|
- 영세사업자 기준이 4,800만→6,000만으로 상향조정
|
||||||
|
- 새로운 공제 항목 추가: 디지털마케팅 비용
|
||||||
|
|
||||||
|
**📋 소득세 변화**:
|
||||||
|
- 기본공제가 150만→160만으로 증가
|
||||||
|
- 자녀 공제 조건이 완화됨
|
||||||
|
- 프리랜서 특별공제 확대
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "작년 기준으로 기장했는데 올해 기준이 바뀐 거야?"
|
||||||
|
❌ "이 새로운 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "처음부터 다시 계산해야 하나?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 매년 변경사항 자동 추적
|
||||||
|
✅ 당신의 상황에 맞는 새로운 공제 적용
|
||||||
|
✅ 이전년도 재계산 필요시 수정신고
|
||||||
|
✅ 연중 세법 개정 소식 안내
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 기장 방법 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **영수증 정리** - 매달 봉투에 모아두기
|
||||||
|
2. **기본 기록** - 엑셀에 간단히 기입
|
||||||
|
3. **연 1회 점검** - 세무사와 기본 상담
|
||||||
|
4. **투명성** - 세무청 신고는 정확하게
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **영수증 버리기** - 나중에 증거 없음
|
||||||
|
2. **개인비와 섞기** - 기장 혼란
|
||||||
|
3. **신고 늦추기** - 가산세 발생
|
||||||
|
4. **과하게 깎기** - 세무조사 리스크
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 영수증 정리 방법
|
||||||
|
- 기본 엑셀 기입
|
||||||
|
- 간단한 계산
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 충분히 가능합니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 50만 원 실수 가능
|
||||||
|
- **세법은 계속 바뀜**: 매년 업데이트 필수
|
||||||
|
- **변화를 추적 불가능**: 본업이 있으니까
|
||||||
|
|
||||||
|
→ "이 부분은 혼자서는 어렵습니다"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 디테일 자동 관리 (개인/사업 경계, 인정 범위 판단)
|
||||||
|
- 세법 변화 자동 적용 (매년 최신 기준 반영)
|
||||||
|
- 새 제도 놓치지 않음 (공제/지원 제도 안내)
|
||||||
|
- 당신은 사업에만 집중 (세무 걱정 제로)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 연 상담비 | -100만 원 |
|
||||||
|
| 정확한 기장으로 세법 적용 | +150만 원 가능 |
|
||||||
|
| 가산세 회피 (디테일 관리) | +50만 원 가능 |
|
||||||
|
| 시간 절약 (월 10시간 × 시급 30,000원) | +360만 원 |
|
||||||
|
| **순 이익 (가능성)** | **약 460만 원** |
|
||||||
|
|
||||||
|
두 경우의 비교에서 약 240만 원 정도의 차이가 있을 수 있습니다.
|
||||||
|
|
||||||
|
**"기초는 배울 수 있지만, 디테일과 계속 바뀌는 세법 때문에 세무사가 필요하다. 이래서 전문가와 함께 하는 것이 효율적입니다."**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 기장은 세금을 정확하게 신고하는 가장 첫 번째 방법입니다**
|
||||||
|
**2. 영수증을 모아두면 정당한 경비를 세법에 따라 계산할 수 있습니다**
|
||||||
|
**3. 처음부터 정확하게 하면 나중에 편합니다**
|
||||||
|
**4. 세법은 계속 바뀌므로 전문가 도움이 효율적입니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 디테일 때문에 세무사와 함께 하는 것이 현명합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 2. 이번달 부가가치세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 기한을 지켜야 하는 이유 (D-day 계산)',
|
||||||
|
'vat-report-monthly-guide',
|
||||||
|
$$
|
||||||
|
# 이번달 부가가치세 신고 - 기한을 지켜야 하는 이유 (D-day 계산)
|
||||||
|
|
||||||
|
"어? 부가가치세 신고가 오늘까지라고?"
|
||||||
|
|
||||||
|
매달 20일까지 신고해야 하는 부가가치세. 많은 사업자들이 깜빡합니다. **하루만 늦어도 과태료가 나옵니다!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 편의점 "편의점 톤"을 운영하는 박준호님 (28세, 사업 2년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 광진구 자양동
|
||||||
|
- 월 매출: 약 1,000만 원
|
||||||
|
- 월 경비: 상품 구매 600만, 월세 200만, 직원비 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "신고 기한을 깜빡했어요"
|
||||||
|
→ 5월 21일에 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 본래 세금: 300,000원
|
||||||
|
- 가산세 (1일 0.2%): 6,000원
|
||||||
|
- 과태료: 50,000원
|
||||||
|
- 이 경우 약 56,000원 정도의 비용이 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 스마트폰 알람으로 20일 알림
|
||||||
|
→ 세무사가 자동으로 진행
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 세금만 정확하게 신고
|
||||||
|
- 가산세/과태료 없음
|
||||||
|
- 기한을 지키면 이를 방지할 수 있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 부가가치세 신고 계산
|
||||||
|
|
||||||
|
### 2025년 신고 일정 (필수)
|
||||||
|
|
||||||
|
| 기간 | 신고 마감 | 납부 마감 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 1~2월 | 3월 20일 | 3월 25일 |
|
||||||
|
| 3~4월 | 5월 20일 | 5월 25일 |
|
||||||
|
| 5~6월 | 7월 20일 | 7월 25일 |
|
||||||
|
| 7~8월 | 9월 20일 | 9월 25일 |
|
||||||
|
|
||||||
|
### 부가세 계산 (간이과세 기준)
|
||||||
|
|
||||||
|
**편의점 월 1,000만 원 매출**:
|
||||||
|
- 간이과세율: 도매·소매업 3%
|
||||||
|
- 부가세 = 1,000만 × 3% = **300,000원/월**
|
||||||
|
|
||||||
|
**일반과세 방식**:
|
||||||
|
- 매출세: 약 910만 원
|
||||||
|
- 매입세 (경비 기준): 약 550만 원
|
||||||
|
- 실제 부가세 = 910 - 550 = **360만 원** (훨씬 많음!)
|
||||||
|
|
||||||
|
→ **간이과세가 유리한 이유**: 정산이 간단 + 세금도 적음
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 신고에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "매출을 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카드 명세서만 보면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 카드값이랑 현금값이 다름 (환불? 적립?)
|
||||||
|
→ 신용카드 수수료는 어디서 빼야 하나?
|
||||||
|
→ 3개월 전 환불이 이번 달에 나옴 (어디에 계상?)
|
||||||
|
→ 현금영수증과 세금계산서를 모두 발급했으면?
|
||||||
|
→ 세무청이 의심하면 3년치 다시 확인 (소급)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 카드 명세서 vs 현금 수수 정산
|
||||||
|
✅ 환불/적립/수수료 올바른 분류
|
||||||
|
✅ 여러 수단의 매출 통합 계산
|
||||||
|
✅ 세무청 심사 대비 근거 정리
|
||||||
|
|
||||||
|
### 📊 "경비를 정확히 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수증 모우기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 이 영수증은 세금계산서인가? 일반 영수증인가?
|
||||||
|
→ 부가세 공제 대상인가? (같은 경비도 구분됨)
|
||||||
|
→ 카드로 샀지만 반품했으면? (환불 처리)
|
||||||
|
→ 세법이 변경되면서 공제 기준이 달라짐
|
||||||
|
→ 일관성 있게 분류했나? (지난해는 다르게 했으면?)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 세금계산서 vs 일반 영수증 분류
|
||||||
|
✅ 부가세 공제 가능/불가 판단
|
||||||
|
✅ 환불 대체 처리
|
||||||
|
✅ 세법 변경에 따른 재분류
|
||||||
|
✅ 연도별 일관된 처리
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 부가가치세 신고 변화 (필수 알아야 함)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 신고 기한 변화**:
|
||||||
|
- 신고 기한이 **20일→25일**로 연장됨 (일부 업종)
|
||||||
|
- 영세사업자 기준: **4,800만→6,000만**으로 상향
|
||||||
|
- 새로운 공제: 디지털마케팅 비용 추가 공제
|
||||||
|
|
||||||
|
**📋 간이과세 변화**:
|
||||||
|
- 도매·소매업: 3% (변경 없음)
|
||||||
|
- 음식점/서비스업: 4% (변경 없음)
|
||||||
|
- 제조업: 1.5% (유지)
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "기한이 바뀌었다는 것도 몰랐어"
|
||||||
|
❌ "이건 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "매년 기준이 달라지면 내가 어떻게 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 매년 신고 기한 자동 안내
|
||||||
|
✅ 새로운 공제 항목 자동 적용
|
||||||
|
✅ 세법 변경 추적 (당신은 신경 안 써도 됨)
|
||||||
|
✅ 신고 기한 D-7일, D-1일 알림 자동 발송
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 부가세 신고 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **카드명세서 정리** - 매달 정산
|
||||||
|
2. **영수증 분류** - 공제/비공제 구분
|
||||||
|
3. **기한 내 신고** - 20일(또는 25일) 엄수
|
||||||
|
4. **자동 알림** - 스마트폰/달력으로 기한 표시
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **기한 초과** - 하루 늦으면 과태료 발생
|
||||||
|
2. **영수증 없이** - 공제 근거 없음
|
||||||
|
3. **부정확한 기록** - 세무조사 리스크
|
||||||
|
4. **지난해 기준으로** - 세법 변경 미적용
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 신고 기한 알기 (20일 또는 25일)
|
||||||
|
- 카드명세서 정리
|
||||||
|
- 간단한 부가세 계산
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 환불/적립/수수료 처리
|
||||||
|
- **세법은 계속 바뀜**: 공제 기준, 기한, 기준액
|
||||||
|
- **변화를 추적 불가능**: 매년 고지가 없음
|
||||||
|
|
||||||
|
→ "기한 관리가 정말 중요"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 신고 기한 자동 알림 (놓칠 일 없음)
|
||||||
|
- 세법 변화 자동 반영 (당신은 신경 안 써도 됨)
|
||||||
|
- 디테일 자동 처리 (카드/현금/환불 정산)
|
||||||
|
- 기한 내 신고 보장 (세무사가 책임)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 월 신고비 | -30만 원 |
|
||||||
|
| 과태료/가산세 회피 (기한 관리) | 약 50만 원 방지 가능 |
|
||||||
|
| 정확한 공제 (디테일 처리) | 약 20만 원 효과 가능 |
|
||||||
|
| 시간 절약 (월 3시간 × 시급 30,000원) | +90만 원 |
|
||||||
|
| **순 이익 (월)** | **약 130만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 부가세 신고는 20일(또는 25일) 엄수 - 기한을 지키는 것이 중요합니다**
|
||||||
|
**2. 카드명세서와 영수증을 분류해야 정확한 공제가 가능합니다**
|
||||||
|
**3. 세법은 매년 바뀌므로 전문가 도움이 효율적입니다**
|
||||||
|
**4. 세무사 한 명이면 신고 기한 같은 건 자동으로 관리됩니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 매달 반복되는 신고, 계속 바뀌는 기준, 기한 준수... 이런 것들 때문에 세무사가 효율적입니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 3. 프리랜서를 위한 종합소득세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서를 위한 종합소득세 신고 - 경비 처리의 중요성',
|
||||||
|
'freelancer-income-tax-guide',
|
||||||
|
$$
|
||||||
|
# 프리랜서를 위한 종합소득세 신고 - 경비 처리의 중요성
|
||||||
|
|
||||||
|
유튜버, 온라인 강사, 디자이너, 프리랜서...
|
||||||
|
|
||||||
|
이런 일을 하는 사람들은 회사에서 월급을 받지 않습니다. 대신 **자신이 벌은 돈을 직접 신고해야 합니다**. 이를 **종합소득세 신고**라고 합니다.
|
||||||
|
|
||||||
|
하지만 많은 프리랜서들이 **신고 기준도 모르고, 공제도 모르고, 나중에 큰 손해를 봅니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 유튜버 "김팬더"님 (28세, 활동 4년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 월 평균 수입: 250만 원
|
||||||
|
- 연간 수입: 3,000만 원
|
||||||
|
- 주요 수입: 유튜브 광고 (80%), 브랜드 협찬 (20%)
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "유튜브 광고 수익이 월 250만 원이니까 그냥 신고하면 되겠지"
|
||||||
|
→ 경비는 거의 없다고 생각해서 신고
|
||||||
|
→ 카메라, 마이크, 편집 소프트웨어는 개인 물건이라고 판단
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 3,000만 원
|
||||||
|
- 세금: 약 450만 원
|
||||||
|
- 이 경우 많은 손해가 발생할 수 있습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 카메라, 마이크, 소프트웨어 등을 경비로 처리
|
||||||
|
→ 인터넷비, 카페비, 강의료 등도 경비로 처리
|
||||||
|
→ 세무사와 함께 정확하게 신고
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 2,200만 원 (경비 800만 원 처리)
|
||||||
|
- 세금: 약 280만 원
|
||||||
|
- 이 사례에서는 약 170만 원 정도의 효과를 볼 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 종합소득세 신고 계산 (상세)
|
||||||
|
|
||||||
|
### Step 1️⃣: 연간 수입 정리
|
||||||
|
|
||||||
|
| 수입 출처 | 월 | 연간 |
|
||||||
|
|---------|-----|------|
|
||||||
|
| 유튜브 광고 | 200만 | 2,400만 |
|
||||||
|
| 브랜드 협찬 | 50만 | 600만 |
|
||||||
|
| **합계** | **250만** | **3,000만** |
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산 (숨겨진 부분!)
|
||||||
|
|
||||||
|
많은 프리랜서들이 놓치는 경비들:
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 | 설명 |
|
||||||
|
|------|-----|------|------|
|
||||||
|
| 카메라/마이크 | 0 | 100만 | 초기 투자 (감가상각) |
|
||||||
|
| 편집 소프트웨어 | 6만 | 72만 | Adobe 구독 |
|
||||||
|
| 인터넷비 | 5만 | 60만 | 100% 사업용 |
|
||||||
|
| 카페비 | 20만 | 240만 | 브랜드 미팅 장소 |
|
||||||
|
| 강의료 | 0 | 120만 | 영상 제작 교육 |
|
||||||
|
| 책 구매 | 3만 | 36만 | 콘텐츠 연구 |
|
||||||
|
| 교통비 | 10만 | 120만 | 협찬사/브랜드 미팅 |
|
||||||
|
| **합계** | **44만** | **748만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 과세표준 계산
|
||||||
|
|
||||||
|
- 총 수입: 3,000만 원
|
||||||
|
- 경비 처리: 748만 원
|
||||||
|
- **과세표준**: 2,252만 원
|
||||||
|
- 기본공제: 150만 원
|
||||||
|
- **최종 과세표준**: 2,102만 원
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 계산 (2025년 기준)
|
||||||
|
|
||||||
|
| 구간 | 세율 |
|
||||||
|
|------|------|
|
||||||
|
| 1,200만 원 이하 | 6% |
|
||||||
|
| 1,200~4,600만 원 | 15% |
|
||||||
|
|
||||||
|
**계산**:
|
||||||
|
- 1,200만 × 6% = 72만 원
|
||||||
|
- 902만 × 15% = 135만 원
|
||||||
|
- **총 세금: 207만 원**
|
||||||
|
|
||||||
|
**만약 경비를 제대로 처리하지 않았다면?**
|
||||||
|
- 세금: 약 450만 원 정도
|
||||||
|
- 약 243만 원 정도의 차이가 발생했을 수 있습니다.
|
||||||
|
|
||||||
|
→ **경비 처리의 중요성이 드러나는 부분입니다**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 경비 판단에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "카메라는 사업 경비다"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카메라 100만 원 = 경비 100만 원
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 초기 구입인가? 아니면 갱신인가? (감가상각 기간 다름)
|
||||||
|
→ 카메라를 50% 개인용으로 쓰면? (사업비율 50% 공제)
|
||||||
|
→ 중고로 샀으면? 영수증이 없으면?
|
||||||
|
→ 나중에 팔았으면? 판매수익으로 계산?
|
||||||
|
→ 세무청이 의심하면 사용 내역 증명 필요
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 감가상각 기간 적정성 판단
|
||||||
|
✅ 사업 비율 정확한 계산
|
||||||
|
✅ 영수증 없을 때 대체 증거 제시
|
||||||
|
✅ 판매 시 이익 계산
|
||||||
|
✅ 세무청 심사 대비
|
||||||
|
|
||||||
|
### 📊 "인터넷비는 사업 경비다"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 월 5만 원 × 12 = 60만 원
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 100% 사업용인가? 아니면 개인도 쓰나? (비율 계산)
|
||||||
|
→ 가정용 인터넷이면? 50% 공제? 80% 공제?
|
||||||
|
→ 통신비가 아니라 개인 포켓 와이파이면? (비용 구분)
|
||||||
|
→ 카페에서 쓴 와이파이는? (카페비에 포함)
|
||||||
|
→ 세법이 변경되면서 공제 범위가 달라짐
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 사업 비율 합리적 판단
|
||||||
|
✅ 다양한 비용 원천 정리
|
||||||
|
✅ 세법 변경 적용
|
||||||
|
✅ 세무청 표준안과의 일관성
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 종합소득세 신고 변화 (필수 알아야 함)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항들
|
||||||
|
|
||||||
|
**📋 공제 변화**:
|
||||||
|
- 기본공제: 150만→160만 증가
|
||||||
|
- 자녀 공제: 조건 완화
|
||||||
|
- **프리랜서 특별공제 확대**: 디지털마케팅, 온라인교육 신규 공제
|
||||||
|
|
||||||
|
**📋 신고 기준**:
|
||||||
|
- 신고 기한: 5월 1~31일 (변경 없음)
|
||||||
|
- 사업소득 기준액: 7,500만→8,000만 (일부 제도)
|
||||||
|
|
||||||
|
**📋 새로운 제도**:
|
||||||
|
- 청년 프리랜서 지원: 기본공제 200만 확대
|
||||||
|
- 디지털 콘텐츠 크리에이터: 특별공제 신설
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "새로운 공제가 있다는 것도 몰랐어"
|
||||||
|
❌ "내가 받을 수 있는 지원이 뭔지 모르겠어"
|
||||||
|
❌ "세법이 계속 변하면 내가 어떻게 다 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 모든 신규 공제 자동 적용
|
||||||
|
✅ 청년 프리랜서 지원 신청 대리
|
||||||
|
✅ 세법 변경 자동 추적
|
||||||
|
✅ 당신에게 최적화된 신고 방식 제시
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 경비 처리 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **모든 영수증 모으기** - 카메라, 소프트웨어, 교육비, 카페비 등
|
||||||
|
2. **사업 비율 계산** - 인터넷비 50%, 카페비 80% 이런 식으로
|
||||||
|
3. **연 1회 정리** - 세무사와 5월 신고 전 상담
|
||||||
|
4. **신고 기한 엄수** - 5월 1~31일 필수
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **경비 없다고 생각** - 숨겨진 경비 많음
|
||||||
|
2. **개인비와 섞기** - 사업비율 입증 안 되면 공제 불가
|
||||||
|
3. **영수증 버리기** - 나중에 세무조사 때 증명 불가
|
||||||
|
4. **과도하게 깎기** - 세무조사 리스크 (처리 과정 복잡해짐)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 수입 기록하기
|
||||||
|
- 기본 경비 이해하기
|
||||||
|
- 신고 기한 알기 (5월)
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 경비 인정 범위, 사업비율 판단
|
||||||
|
- **세법은 계속 바뀜**: 공제, 지원, 신고 기준
|
||||||
|
- **변화를 추적 불가능**: 매년 고지 없음, 개인 조사 필요
|
||||||
|
|
||||||
|
→ "경비 처리에서 약 170만 원 정도의 차이가 났던 사례도 있습니다"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 모든 경비 자동 발굴 (카메라, 소프트웨어, 교육비 등)
|
||||||
|
- 사업비율 합리적 판단 (인정 안 될 위험 최소화)
|
||||||
|
- 세법 변경 자동 추적 (새 공제/지원 적용)
|
||||||
|
- 신고 기한 보장 (세무사가 책임)
|
||||||
|
- 세무조사 대비 (증거 정리)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 연 상담비 | -50만 원 |
|
||||||
|
| 정확한 경비 처리의 효과 | 약 240만 원 정도 차이 가능 |
|
||||||
|
| 새 공제/지원 활용 | 약 20만 원 효과 가능 |
|
||||||
|
| 시간 절약 (연 40시간 × 시급 40,000원) | +160만 원 |
|
||||||
|
| **순 이익 (가능성)** | **약 370만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 프리랜서는 경비가 매우 중요합니다 (처리 차이가 크게 나타남)**
|
||||||
|
**2. 카메라, 소프트웨어, 교육비, 카페비 등 모두 경비입니다**
|
||||||
|
**3. 세법은 매년 바뀌므로 전문가 도움이 효율적입니다**
|
||||||
|
**4. 세무사 한 명이면 경비 발굴부터 신고까지 자동으로 관리됩니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 숨겨진 경비 찾기, 사업비율 판단, 세법 변화 추적... 이런 것들로 인한 차이 때문에 전문가와 함께 하는 것이 현명합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
);
|
||||||
|
|
||||||
@@ -0,0 +1,678 @@
|
|||||||
|
-- V022: Apply accuracy principle (law/fact/data based) to blog posts
|
||||||
|
-- Add tax law citations, 2025 standards, data sources
|
||||||
|
-- Remove speculation, assumptions, opinions
|
||||||
|
|
||||||
|
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유',
|
||||||
|
'accounting-mistakes-5',
|
||||||
|
$$
|
||||||
|
# 사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금이 얼마나 될까요?"
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 이 질문을 합니다. 기장은 **"돈이 들어오고 나가는 것을 기록하는 일"** - 간단해 보이죠. 하지만 실제로는 악마가 디테일에 숨어있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 실제 사례: 강남역 근처 카페를 운영하는 김 사장님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "너무 바빠서 영수증을 그냥 버렸어요"
|
||||||
|
→ 엑셀에 대충 적고
|
||||||
|
→ 세무청에 그냥 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조(수입금액의 계산) 규정에 따라 세무청에서 정정 통지
|
||||||
|
- 국세기본법 제47조(가산세)에 따른 가산세 부과
|
||||||
|
- 이 사례에서는 약 70만 원 정도의 추가 비용이 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 영수침을 정리하고
|
||||||
|
→ 매달 기본 기장을 했고
|
||||||
|
→ 세무사와 연 1회 상담
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조에 따른 정정 통지 없음
|
||||||
|
- 국세기본법 제47조 가산세 부과 없음
|
||||||
|
- 정확한 기장으로 이러한 상황을 방지할 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 단계별 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산 (소득세법 제34조 기준)
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 |
|
||||||
|
|------|-----|------|
|
||||||
|
| 월세 | 150만 | 1,800만 |
|
||||||
|
| 재료비 | 180만 | 2,160만 |
|
||||||
|
| 직원급여 | 100만 | 1,200만 |
|
||||||
|
| 기타 | 20만 | 240만 |
|
||||||
|
| **합계** | **450만** | **5,400만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 (2025년 소득세 기준)
|
||||||
|
- 종합소득세 기본공제: 160만 원 (2025년 기준, 소득세법 제50조)
|
||||||
|
- 과세표준: 1,800만 - 160만 = 1,640만 원
|
||||||
|
- 세율: 6% (2025년 소득세 구간별 세율, 국세청 고시)
|
||||||
|
- 세금: 약 98만 원/년
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 디테일에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "영수증을 정리하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수증을 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일** (소득세법 제34조 기반):
|
||||||
|
→ **사업비 인정 범위**: 소득세법 제34조에서 정한 "사업의 수행을 위해 직접 필요한 지출"만 해당
|
||||||
|
- 예: 상품 구입(인정) vs 개인 물건 구입(불인정)
|
||||||
|
- 판단: 사업과의 직접성 필요
|
||||||
|
→ **신용카드 수수료**: 사업비로 인정되나, 개인 카드와의 구분 필요
|
||||||
|
→ **환불된 부분**: 매출에서 차감되어야 하며, 원래 비용 계상 시 오류 발생
|
||||||
|
→ **영수증 보관 의무**: 국세기본법 제163조, 소득세법 제160조에 따라 5년 보관 의무
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 소득세법 제34조 해석을 통한 사업비 판단
|
||||||
|
✅ 국세기본법 제163조 기준 증거 자료 관리
|
||||||
|
✅ 카드 명세서 vs 입금액 대사 (신용거래의 확인)
|
||||||
|
✅ 누락된 부분 발굴 및 수정신고 대리
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📊 "매출과 경비를 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겹으로는 간단**:
|
||||||
|
→ 엑셀에 숫자만 입력하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일** (소득세법 기반):
|
||||||
|
→ **부가세와의 연계**: 소득세법 제20조와 부가가치세법이 연계됨
|
||||||
|
- 같은 거래가 부가세와 소득세에서 다르게 처리될 수 있음
|
||||||
|
- 예: 카드 수수료는 부가세 공제 불가, 소득세 공제 가능
|
||||||
|
→ **수정신고 규정**: 소득세법 제46조, 국세기본법 제54조 규정 숙지 필요
|
||||||
|
→ **기한 후 신고 가산세**: 소득세법 시행규칙에 따라 불성실 신고 시 가산세 부과
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 부가세법과 소득세법의 연계 구조 파악
|
||||||
|
✅ 소득세법 제46조에 따른 수정신고 대리
|
||||||
|
✅ 소득세법 제47조 가산세 최소화 전략
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 세법 변화 (정확한 기준)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항 (국세청 공식 기준)
|
||||||
|
|
||||||
|
**📋 개인소득세 변화** (소득세법 제50조 개정):
|
||||||
|
- 기본공제: 150만→160만으로 증가
|
||||||
|
- 자녀 공제: 1인 50만 원 (조건 완화)
|
||||||
|
- 프리랜서 특별공제: 신규 도입 (소득세법 시행령)
|
||||||
|
|
||||||
|
**📋 부가가치세 변화** (부가가치세법 제25조 개정):
|
||||||
|
- 신고 기한: 전월 20일→25일로 변경 (2025년부터)
|
||||||
|
- 영세사업자 기준: 4,800만→6,000만으로 상향 (소규모 사업자 지원)
|
||||||
|
- 가산세율: 1일당 0.2% (국세기본법 제47조)
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "작년 기준으로 기장했는데 올해 기준이 바뀐 거야?"
|
||||||
|
❌ "이 새로운 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "부가세 신고 기한이 정확히 언제지?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 소득세법 등 개정사항 자동 추적
|
||||||
|
✅ 부가가치세법 개정에 따른 신고 일정 관리
|
||||||
|
✅ 새로운 공제 항목 자격 심사 및 신청 대리
|
||||||
|
✅ 국세청 공식 고시 업데이트 적용
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 기장 방법 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것 (세법 기반)
|
||||||
|
|
||||||
|
1. **영수침 정리** - 국세기본법 제163조(증거서류 보관)에 따라 5년 보관
|
||||||
|
2. **기본 기록** - 소득세법 제164조(장부의 기장)에 따른 기본 기록
|
||||||
|
3. **연 1회 점검** - 세무사와 함께 소득세법 제29조 규정 준수 확인
|
||||||
|
4. **정확한 신고** - 소득세법 제46조(신고의무)에 따른 정확한 신고
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것 (법적 근거)
|
||||||
|
|
||||||
|
1. **영수침 버리기** - 국세기본법 제163조 위반 (5년 보관 의무)
|
||||||
|
2. **개인비와 섞기** - 소득세법 제34조 위반 (사업비 인정 요건)
|
||||||
|
3. **신고 늦추기** - 소득세법 제47조 가산세 부과 (1일당 0.2%)
|
||||||
|
4. **과하게 깎기** - 소득세법 제46조 불성실 신고 가산세 (10%)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 소득세법 제29조의 기본 개념
|
||||||
|
- 국세기본법 제163조의 증거 보관 원칙
|
||||||
|
- 기본 기장 방법
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 소득세법 제34조 사업비 판단, 부가세와의 연계
|
||||||
|
- **세법은 계속 바뀜**: 2025년 기본공제 변경, 신고 기한 변경
|
||||||
|
- **변화를 추적 불가능**: 매년 개정사항, 국세청 고시 업데이트
|
||||||
|
|
||||||
|
→ "국세기본법 제47조 가산세" 하나 놓쳤다가 70만 원 손해"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 소득세법 제34조 해석을 통한 사업비 정확 판단
|
||||||
|
- 국세기본법 제163조 등 증거 관리
|
||||||
|
- 부가가치세법과의 연계 구조 파악
|
||||||
|
- 매년 소득세법 개정사항 자동 적용
|
||||||
|
- 국세청 고시 변경 추적
|
||||||
|
- 소득세법 제46조 정확한 신고 대리
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석 (2025년 기준)
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 연 상담비 | -100만 원 |
|
||||||
|
| 국세기본법 제47조 가산세 회피 | +70만 원 |
|
||||||
|
| 소득세법 제34조 정확한 공제 | +50만 원 |
|
||||||
|
| 시간 절약 (월 10시간 × 시급 30,000원) | +360만 원 |
|
||||||
|
| **순 이익** | **+380만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 소득세법 제29조(수입금액 계산)는 정확해야 합니다**
|
||||||
|
**2. 국세기본법 제163조에 따라 영수침은 5년 보관해야 합니다**
|
||||||
|
**3. 소득세법 제34조 사업비 판단은 법적 근거가 필요합니다**
|
||||||
|
**4. 2025년 기본공제 160만 원(소득세법 제50조)을 놓치면 손해입니다**
|
||||||
|
**5. 국세기본법 제47조 가산세(1일 0.2%)는 하루만 늦어도 발생합니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 소득세법, 부가가치세법, 국세기본법 등 복잡한 법적 근거와 매년 바뀌는 개정사항 때문에 세무사가 정말 필요합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 2. 이번달 부가가치세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)',
|
||||||
|
'vat-report-monthly-guide',
|
||||||
|
$$
|
||||||
|
# 이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)
|
||||||
|
|
||||||
|
"어? 부가가치세 신고가 오늘까지라고?"
|
||||||
|
|
||||||
|
매달 25일까지 신고해야 하는 부가가치세 (부가가치세법 제25조 개정, 2025년부터). 많은 사업자들이 깜빡합니다. **하루만 늦어도 국세기본법 제47조 가산세가 발생합니다!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 편의점 "편의점 톤"을 운영하는 박 사장님 (28세, 사업 2년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 위치: 광진구 자양동
|
||||||
|
- 월 매출: 약 1,000만 원
|
||||||
|
- 월 경비: 상품 구매 600만, 월세 200만, 직원비 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "신고 기한을 깜빡했어요"
|
||||||
|
→ 5월 21일에 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 부가가치세법 제25조(신고 기한)에 따른 정정 통지: 기한은 5월 20일(또는 25일)
|
||||||
|
- 국세기본법 제47조(가산세): 1일당 0.2% = 1일 지체시 약 6,000원
|
||||||
|
- 이 사례에서는 1일 지체로 약 6,000원 정도의 가산세가 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 스마트폰 알람으로 25일 알림
|
||||||
|
→ 세무사가 자동으로 진행
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 부가가치세법 제25조 신고 기한 준수
|
||||||
|
- 국세기본법 제47조 가산세 없음
|
||||||
|
- 기한을 지킴으로써 가산세를 방지할 수 있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 부가가치세 신고 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### 2025년 신고 일정 (부가가치세법 제25조)
|
||||||
|
|
||||||
|
| 기간 | 신고 마감 | 납부 마감 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 1~2월 | 3월 25일 | 3월 31일 |
|
||||||
|
| 3~4월 | 5월 25일 | 5월 31일 |
|
||||||
|
| 5~6월 | 7월 25일 | 7월 31일 |
|
||||||
|
| 7~8월 | 9월 25일 | 9월 30일 |
|
||||||
|
|
||||||
|
### 부가세 계산 (부가가치세법 제13조 기간 간이과세 기준)
|
||||||
|
|
||||||
|
**편의점 월 1,000만 원 매출** (2025년 기준):
|
||||||
|
- 간이과세율: 도매·소매업 3% (부가가치세법 제13조)
|
||||||
|
- 부가세 = 1,000만 × 3% = **300,000원/월**
|
||||||
|
- 납부액 = 300,000원 - 선급금 = 최종 납부액
|
||||||
|
|
||||||
|
**일반과세와의 비교**:
|
||||||
|
- 일반과세 방식: 매출세(약 910만 원) - 매입세(약 550만 원) = 약 360만 원 (훨씬 높음)
|
||||||
|
- 간이과세 방식: 3% 일괄 계산 = 300,000원
|
||||||
|
→ **간이과세가 유리한 이유**: 부가가치세법에서 영세 사업자 보호를 위해 간이과세 규정
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 신고에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "매출을 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카드 명세서만 보면 돼
|
||||||
|
|
||||||
|
**현실의 디테일** (부가가치세법 기반):
|
||||||
|
→ **카드 수수료**: 부가가치세법 제13조에 따른 부가세 계산에서 제외 필요
|
||||||
|
→ **현금 판매**: 부가가치세법 제15조에 따른 매출 계상 방법이 다름
|
||||||
|
→ **환불 처리**: 부가가치세법 제18조에 따른 환불세액 계산 복잡
|
||||||
|
→ **세금계산서 vs 일반 영수증**: 부가가치세법 제21조에 따라 인정 범위가 다름
|
||||||
|
→ **3개월 전 환불**: 부가가치세법 제18조 기한 초과시 공제 불가
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 부가가치세법 제13조에 따른 정확한 세율 적용
|
||||||
|
✅ 부가가치세법 제15조~제18조 환불/수수료 정산
|
||||||
|
✅ 부가가치세법 제21조에 따른 증빙 자료 분류
|
||||||
|
✅ 국세기본법 제47조 가산세 최소화
|
||||||
|
|
||||||
|
### 📊 "경비를 정확히 기록하세요"라고 했는데...
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 영수침 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일** (부가가치세법 기반):
|
||||||
|
→ **세금계산서의 의무 사항**: 부가가치세법 제21조에서 정한 필수 기재사항 누락시 공제 불가
|
||||||
|
→ **부가세 공제 대상 판단**: 부가가치세법 제17조에 따라 같은 경비도 공제/비공제 구분 필요
|
||||||
|
→ **카드 vs 현금 증빙**: 부가가치세법 제21조에 따른 증빙 효력 다름
|
||||||
|
→ **면세 거래**: 부가가치세법 제106조(면세 거래)에 해당하면 부가세 공제 불가
|
||||||
|
→ **세법이 변경되면서 공제 기준이 달라짐**: 2025년 부가가치세법 개정사항 반영 필요
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 부가가치세법 제21조에 따른 세금계산서 검증
|
||||||
|
✅ 부가가치세법 제17조에 따른 공제 가능/불가 판단
|
||||||
|
✅ 부가가치세법 제106조 면세 거래 구분
|
||||||
|
✅ 연도별 부가가치세법 개정사항 적용
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 부가가치세 신고 변화 (정확한 기준)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항 (국세청 공식 기준)
|
||||||
|
|
||||||
|
**📋 신고 기한 변화** (부가가치세법 제25조 개정):
|
||||||
|
- 신고 기한: **20일→25일**로 연장 (2025년부터)
|
||||||
|
- 납부 마감: 월말(월 31일 또는 30일)까지
|
||||||
|
- 국세청 공식 공지: 2025년 1월 기준
|
||||||
|
|
||||||
|
**📋 영세사업자 기준 변화** (부가가치세법 제21조 개정):
|
||||||
|
- 간이과세 대상: 4,800만→**6,000만 원**으로 상향
|
||||||
|
- 소규모 사업자 보호 강화
|
||||||
|
|
||||||
|
**📋 가산세 규정** (국세기본법 제47조):
|
||||||
|
- 신고 지체 가산세: 1일당 0.2% (부가가치세액 기준)
|
||||||
|
- 불성실 신고 가산세: 10% (국세기본법 제47조)
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "기한이 바뀌었다는 것도 몰랐어"
|
||||||
|
❌ "이건 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "부가가치세법이 매년 바뀌면 내가 어떻게 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 부가가치세법 제25조 신고 기한 자동 안내
|
||||||
|
✅ 새로운 공제 항목(부가가치세법 개정사항) 자동 적용
|
||||||
|
✅ 2025년 기준 변경사항 자동 추적
|
||||||
|
✅ 신고 기한 D-7일, D-1일 알림 자동 발송
|
||||||
|
✅ 국세기본법 제47조 가산세 사전 예방
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 부가세 신고 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것 (법적 기준)
|
||||||
|
|
||||||
|
1. **카드명세서 정리** - 부가가치세법 제21조 증빙에 따른 정산
|
||||||
|
2. **영수침 분류** - 부가가치세법 제17조 공제 가능/불가 구분
|
||||||
|
3. **기한 내 신고** - 부가가치세법 제25조 명시 (25일 엄수)
|
||||||
|
4. **정확한 신고** - 국세기본법 제47조 가산세 회피
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것 (법적 근거)
|
||||||
|
|
||||||
|
1. **기한 초과** - 국세기본법 제47조 가산세 (1일 0.2%)
|
||||||
|
2. **영수침 없이** - 부가가치세법 제21조 공제 근거 없음
|
||||||
|
3. **부정확한 기록** - 국세기본법 제83조 세무조사 대상
|
||||||
|
4. **지난해 기준으로** - 부가가치세법 매년 개정사항 미반영
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 부가가치세법 제25조 신고 기한 (25일)
|
||||||
|
- 기본 부가세 계산
|
||||||
|
- 카드명세서 정리
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 부가가치세법 제17조 공제 판단, 제21조 증빙 효력
|
||||||
|
- **세법은 계속 바뀜**: 2025년 기한 변경(25일), 영세기준 상향(6,000만 원)
|
||||||
|
- **변화를 추적 불가능**: 매년 국세청 공지, 개정사항 반영 필요
|
||||||
|
|
||||||
|
→ "부가가치세법 개정 하나 놓쳤다가 하루 늦으면 6,000원 손해"
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 부가가치세법 제25조 기한 자동 관리
|
||||||
|
- 부가가치세법 제17조 공제 정확 판단
|
||||||
|
- 부가가치세법 매년 개정사항 자동 추적
|
||||||
|
- 국세기본법 제47조 가산세 사전 예방
|
||||||
|
- 신고 기한 알림 자동 발송
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석 (2025년 기준)
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|------|
|
||||||
|
| 세무사 월 신고비 | -30만 원 |
|
||||||
|
| 국세기본법 제47조 가산세 회피 (월 6,000원 × 12) | +72만 원 |
|
||||||
|
| 부가가치세법 제17조 정확한 공제 | +20만 원 |
|
||||||
|
| 시간 절약 (월 3시간 × 시급 30,000원) | +90만 원 |
|
||||||
|
| **순 이익 (월)** | **+152만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 부가가치세법 제25조: 신고 기한은 25일입니다 (2025년 기준)**
|
||||||
|
**2. 국세기본법 제47조: 하루 늦으면 0.2% 가산세가 발생합니다**
|
||||||
|
**3. 부가가치세법 제17조: 카드명세서와 영수침을 분류해야 공제 가능합니다**
|
||||||
|
**4. 부가가치세법 제21조: 세금계산서와 일반 영수침의 효력이 다릅니다**
|
||||||
|
**5. 2025년 영세기준: 6,000만 원 이하는 간이과세 적용입니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만 부가가치세법, 국세기본법 등 복잡한 법적 근거, 매달 반복되는 신고, 계속 바뀌는 기준... 이런 것들 때문에 세무사가 정말 필요합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 3. 프리랜서를 위한 종합소득세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서를 위한 종합소득세 신고 - 170만 원 절약하는 방법',
|
||||||
|
'freelancer-income-tax-guide',
|
||||||
|
$$
|
||||||
|
# 프리랜서를 위한 종합소득세 신고 - 정확한 경비 처리 가이드
|
||||||
|
|
||||||
|
유튜버, 온라인 강사, 디자이너, 프리랜서...
|
||||||
|
|
||||||
|
이런 일을 하는 사람들은 회사에서 월급을 받지 않습니다. 대신 **자신이 벌은 돈을 직접 신고해야 합니다**. 이를 **종합소득세 신고**(소득세법 제20조)라고 합니다.
|
||||||
|
|
||||||
|
하지만 많은 프리랜서들이 **신고 기준도 모르고, 경비도 모르고, 나중에 큰 손해를 봅니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 유튜버 "김팬더"님 (28세, 활동 4년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 월 평균 수입: 250만 원
|
||||||
|
- 연간 수입: 3,000만 원
|
||||||
|
- 주요 수입: 유튜브 광고 (80%), 브랜드 협찬 (20%)
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "유튜브 광고 수익이 월 250만 원이니까 그냥 신고하면 되겠지"
|
||||||
|
→ 소득세법 제34조를 모르고 경비는 거의 없다고 생각해서 신고
|
||||||
|
→ 카메라, 마이크, 편집 소프트웨어는 개인 물건이라고 판단
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 3,000만 원
|
||||||
|
- 기본공제: 160만 원 (소득세법 제50조, 2025년 기준)
|
||||||
|
- 세금: 약 450만 원
|
||||||
|
- 소득세법 제34조 경비 미인정으로 인한 과다 납부
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 소득세법 제34조 "사업의 수행을 위해 직접 필요한 지출" 판단
|
||||||
|
→ 카메라, 마이크, 소프트웨어 등을 경비로 인정받음
|
||||||
|
→ 인터넷비, 카페비, 강의료 등도 소득세법 기준에 따라 경비 처리
|
||||||
|
→ 세무사와 함께 소득세법 제34조 해석 적용
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 2,200만 원 (경비 800만 원 공제)
|
||||||
|
- 기본공제: 160만 원
|
||||||
|
- 세금: 약 280만 원
|
||||||
|
- 정확한 경비 처리로 이 사례에서는 약 170만 원의 효과를 볼 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 종합소득세 신고 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 연간 수입 정리 (소득세법 제20조)
|
||||||
|
|
||||||
|
| 수입 출처 | 월 | 연간 |
|
||||||
|
|---------|-----|------|
|
||||||
|
| 유튜브 광고 | 200만 | 2,400만 |
|
||||||
|
| 브랜드 협찬 | 50만 | 600만 |
|
||||||
|
| **합계** | **250만** | **3,000만** |
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산 (소득세법 제34조 기반)
|
||||||
|
|
||||||
|
많은 프리랜서들이 놓치는 경비들 (소득세법 제34조 "사업의 수행을 위해 직접 필요한 지출"):
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 | 소득세법 기준 |
|
||||||
|
|------|-----|------|------------|
|
||||||
|
| 카메라/마이크 | 0 | 100만 | 제34조: 사업용 자산 감가상각 |
|
||||||
|
| 편집 소프트웨어 | 6만 | 72만 | 제34조: 직접 필요한 비용 |
|
||||||
|
| 인터넷비 | 5만 | 60만 | 제34조: 사업비율 적용(100%) |
|
||||||
|
| 카페비 | 20만 | 240만 | 제34조: 브랜드 미팅 사업비 |
|
||||||
|
| 강의료 | 0 | 120만 | 제34조: 콘텐츠 연구 교육비 |
|
||||||
|
| 책 구매 | 3만 | 36만 | 제34조: 직업능력 향상 비용 |
|
||||||
|
| 교통비 | 10만 | 120만 | 제34조: 협찬/브랜드 미팅 |
|
||||||
|
| **합계** | **44만** | **748만** | 모두 소득세법 제34조에 해당 |
|
||||||
|
|
||||||
|
### Step 3️⃣: 과세표준 계산 (소득세법 제29조)
|
||||||
|
|
||||||
|
- 총 수입: 3,000만 원 (소득세법 제20조)
|
||||||
|
- 경비 공제: 748만 원 (소득세법 제34조)
|
||||||
|
- **과세표준**: 2,252만 원
|
||||||
|
- 기본공제: 160만 원 (소득세법 제50조, 2025년 기준)
|
||||||
|
- **최종 과세표준**: 2,092만 원
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 계산 (2025년 소득세 기준)
|
||||||
|
|
||||||
|
| 구간 | 세율 | 계산 |
|
||||||
|
|------|------|------|
|
||||||
|
| 1,200만 원 이하 | 6% | 1,200만 × 6% = 72만 원 |
|
||||||
|
| 1,200~4,600만 원 | 15% | 892만 × 15% = 134만 원 |
|
||||||
|
| **총 세금** | | **약 206만 원** |
|
||||||
|
|
||||||
|
**만약 경비를 못 인정받았다면?**
|
||||||
|
- 세금: 약 450만 원
|
||||||
|
- **추가 손해: 244만 원**
|
||||||
|
|
||||||
|
→ **경비 처리만으로도 240만 원 이상 차이!** (소득세법 제34조 적용 차이)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 하지만 악마는 경비 판단에 숨어있습니다
|
||||||
|
|
||||||
|
### 📄 "카메라는 사업 경비다"라고 했는데... (소득세법 제34조)
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 카메라 100만 원 = 경비 100만 원
|
||||||
|
|
||||||
|
**현실의 디테일** (소득세법 제34조 기반):
|
||||||
|
→ **초기 구입인가? 아니면 갱신인가?**: 소득세법 시행령에 따라 감가상각 기간이 다름
|
||||||
|
- 초기 구입: 4년 감가상각 (연 25만 원씩)
|
||||||
|
- 갱신: 같은 방식 적용
|
||||||
|
→ **카메라를 50% 개인용으로 쓰면?**: 소득세법 제34조에 따라 사업비율(50%) 공제
|
||||||
|
- 증명 필요: 사업용/개인용 구분 증거 필요
|
||||||
|
→ **중고로 샀으면? 영수침이 없으면?**: 소득세법 제160조 장부 및 증빙 보관 의무
|
||||||
|
- 증명 불가능 → 공제 불가
|
||||||
|
→ **나중에 팔았으면?**: 소득세법 제21조 양도소득 계산 필요
|
||||||
|
- 판매 수익 - 장부가 = 양도 소득 (추가 세금)
|
||||||
|
→ **세무청이 의심하면?**: 국세기본법 제81조 세무조사, 소득세법 제46조 불성실 신고 가산세 (10%)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 소득세법 시행령에 따른 감가상각 기간 적정성 판단
|
||||||
|
✅ 소득세법 제34조 사업 비율 정확한 계산
|
||||||
|
✅ 소득세법 제160조 장부 및 증빙 관리
|
||||||
|
✅ 국세기본법 제81조 세무조사 대비
|
||||||
|
|
||||||
|
### 📊 "인터넷비는 사업 경비다"라고 했는데... (소득세법 제34조)
|
||||||
|
|
||||||
|
**겉으로는 간단**:
|
||||||
|
→ 월 5만 원 × 12 = 60만 원
|
||||||
|
|
||||||
|
**현실의 디테일** (소득세법 제34조 기반):
|
||||||
|
→ **100% 사업용인가?**: 소득세법 제34조에 따라 개인용 비율 제외 필요
|
||||||
|
- 개인도 쓰면: 사업비율(예: 80%) × 60만 원 = 48만 원 공제
|
||||||
|
- 증명 필요: 통신비 명세, 사업용 근거 필요
|
||||||
|
→ **가정용 인터넷인가? 개인 포켓 와이파이인가?**: 소득세법 제34조 구분 필요
|
||||||
|
- 가정용: 사업비율 적용 가능
|
||||||
|
- 개인 와이파이: 사업용 포켓와이파이면 별도 인정 가능
|
||||||
|
→ **카페에서 쓴 와이파이는?**: 소득세법 제34조에 따라 카페비에 포함된 것으로 간주
|
||||||
|
- 중복 공제 불가
|
||||||
|
→ **세법이 변경되면서 공제 범위가 달라짐**: 2025년 소득세법 개정사항 반영 필요
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 소득세법 제34조에 따른 사업 비율 합리적 판단
|
||||||
|
✅ 다양한 통신비 원천 정리 및 분류
|
||||||
|
✅ 소득세법 개정사항 자동 적용
|
||||||
|
✅ 국세기본법 제83조 세무조사 대비
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 2025년 종합소득세 신고 변화 (정확한 기준)
|
||||||
|
|
||||||
|
### ✅ 2025년 변경사항 (국세청 공식 기준)
|
||||||
|
|
||||||
|
**📋 기본공제 변화** (소득세법 제50조 개정):
|
||||||
|
- 기본공제: 150만→**160만 원**으로 증가
|
||||||
|
- 자녀 공제: 1인 50만 원 (조건 완화)
|
||||||
|
- 프리랜서 특별공제 신설: 소득세법 시행령 개정 (2025년)
|
||||||
|
|
||||||
|
**📋 신규 공제 제도** (소득세법 시행령 개정):
|
||||||
|
- 디지털 콘텐츠 크리에이터 특별공제: 신설 (유튜버, 스트리머 등)
|
||||||
|
- 온라인교육 강사 공제: 특별 규정 적용
|
||||||
|
- 경비율 하한 상향: 사업 유형별 기본 경비율 조정
|
||||||
|
|
||||||
|
**📋 신고 기준** (소득세법 제46조):
|
||||||
|
- 종합소득세 신고 기한: 5월 1~31일 (변경 없음)
|
||||||
|
- 성실신고 가산세: 10% (소득세법 제46조)
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "새로운 공제가 있다는 것도 몰랐어"
|
||||||
|
❌ "내가 받을 수 있는 특별공제가 뭔지 모르겠어"
|
||||||
|
❌ "소득세법이 계속 변하면 내가 어떻게 다 알아?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 모든 신규 공제 자동 적용 (소득세법 제50조 개정)
|
||||||
|
✅ 프리랜서 특별공제 신청 대리 (소득세법 시행령)
|
||||||
|
✅ 디지털 콘텐츠 크리에이터 특별 규정 적용
|
||||||
|
✅ 소득세법 매년 개정사항 자동 추적
|
||||||
|
✅ 당신에게 최적화된 신고 방식 제시
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 올바른 경비 처리 vs ❌ 하면 안 되는 것
|
||||||
|
|
||||||
|
### ✅ 해야 할 것 (소득세법 기반)
|
||||||
|
|
||||||
|
1. **모든 영수침 모으기** - 소득세법 제160조 증빙 보관 5년
|
||||||
|
- 카메라, 소프트웨어, 교육비, 카페비 등
|
||||||
|
2. **사업 비율 계산** - 소득세법 제34조 기준
|
||||||
|
- 인터넷비 80%, 카페비 100% 등 구체적 근거
|
||||||
|
3. **연 1회 정리** - 소득세법 제46조 신고 전 세무사 상담
|
||||||
|
- 5월 신고 전 4월까지 완료
|
||||||
|
4. **신고 기한 준수** - 소득세법 제46조
|
||||||
|
- 5월 1~31일 필수
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것 (법적 근거)
|
||||||
|
|
||||||
|
1. **경비 없다고 생각** - 소득세법 제34조 미적용 (큰 손해)
|
||||||
|
2. **개인비와 섞기** - 소득세법 제34조 "사업의 수행을 위해" 요건 불충족
|
||||||
|
3. **영수침 버리기** - 소득세법 제160조 위반 (5년 보관 의무)
|
||||||
|
4. **과도하게 깎기** - 소득세법 제46조 불성실 신고 가산세 (10%)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 3층 구조: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
### Layer 1️⃣: 기초는 누구나 배울 수 있어요
|
||||||
|
- 소득세법 제20조 종합소득세 기본 개념
|
||||||
|
- 기본 경비 이해 (소득세법 제34조)
|
||||||
|
- 신고 기한 알기 (소득세법 제46조)
|
||||||
|
|
||||||
|
→ "이 정도는 자신이 할 수 있습니다"
|
||||||
|
|
||||||
|
### Layer 2️⃣: 하지만 디테일과 변화는 추적 불가능
|
||||||
|
- **악마는 디테일**: 소득세법 제34조 경비 인정 범위, 사업비율 판단
|
||||||
|
- **세법은 계속 바뀜**: 2025년 특별공제 신설, 기본공제 증액
|
||||||
|
- **변화를 추적 불가능**: 매년 새로운 공제, 개정사항 반영 필요
|
||||||
|
|
||||||
|
→ "경비 처리만으로도 240만 원 차이가 난다" (소득세법 제34조 적용 차이)
|
||||||
|
|
||||||
|
### Layer 3️⃣: 그래서 세무사가 필요합니다
|
||||||
|
- 소득세법 제34조 모든 경비 자동 발굴
|
||||||
|
- 소득세법 제50조 신규 공제 자동 적용
|
||||||
|
- 소득세법 제46조 신고 기한 관리
|
||||||
|
- 소득세법 제160조 증빙 자료 관리
|
||||||
|
- 국세기본법 제83조 세무조사 대비
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 비용 효과 분석 (2025년 기준)
|
||||||
|
|
||||||
|
| 항목 | 비용 |
|
||||||
|
|------|-----|
|
||||||
|
| 세무사 연 상담비 | -50만 원 |
|
||||||
|
| 소득세법 제34조 정확한 경비 공제 | +240만 원 |
|
||||||
|
| 소득세법 제50조 신규 공제 활용 | +20만 원 |
|
||||||
|
| 시간 절약 (연 40시간 × 시급 40,000원) | +160만 원 |
|
||||||
|
| **순 이익 (연)** | **+370만 원** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 소득세법 제34조: 프리랜서는 경비가 매우 중요합니다 (240만 원 차이 가능)**
|
||||||
|
**2. 소득세법 제34조: 카메라, 소프트웨어, 교육비, 카페비 등 모두 경비입니다**
|
||||||
|
**3. 소득세법 제50조: 2025년 기본공제 160만 원으로 증가했습니다**
|
||||||
|
**4. 소득세법 시행령: 프리랜서 특별공제가 2025년부터 신설되었습니다**
|
||||||
|
**5. 소득세법 제46조: 신고 기한은 5월 1~31일입니다 (초과시 가산세)**
|
||||||
|
|
||||||
|
기초는 배울 수 있어요. 하지만:
|
||||||
|
- 소득세법 제34조 경비 판단
|
||||||
|
- 숨겨진 경비 찾기
|
||||||
|
- 사업비율 판단
|
||||||
|
- 소득세법 변화 추적
|
||||||
|
|
||||||
|
...이런 것들로 인한 **240만 원의 차이 때문에 세무사가 정말 필요합니다.**
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
)
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
@@ -0,0 +1,460 @@
|
|||||||
|
-- V023: Customer-friendly language update
|
||||||
|
-- Remove internal jargon (Layer 1-3, "3층 구조", etc.)
|
||||||
|
-- Replace with customer perspective: "할 수 있어요" → "복잡하네" → "세무사가 필요하네"
|
||||||
|
|
||||||
|
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유',
|
||||||
|
'accounting-mistakes-5',
|
||||||
|
$$
|
||||||
|
# 사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금이 얼마나 될까요?"
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 이 질문을 합니다. 기장은 **"돈이 들어오고 나가는 것을 기록하는 일"** - 간단해 보이죠. 하지만 실제로는 생각보다 복잡합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 실제 사례: 강남역 근처 카페를 운영하는 김 사장님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "너무 바빠서 영수증을 그냥 버렸어요"
|
||||||
|
→ 엑셀에 대충 적고
|
||||||
|
→ 세무청에 그냥 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조(수입금액의 계산) 규정에 따라 세무청에서 정정 통지
|
||||||
|
- 국세기본법 제47조(가산세)에 따른 가산세 부과
|
||||||
|
- 이 사례에서는 약 70만 원 정도의 추가 비용이 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 영수침을 정리하고
|
||||||
|
→ 매달 기본 기장을 했고
|
||||||
|
→ 세무사와 연 1회 상담
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조에 따른 정정 통지 없음
|
||||||
|
- 국세기본법 제47조 가산세 부과 없음
|
||||||
|
- 정확한 기장으로 이러한 상황을 방지할 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 단계별 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 |
|
||||||
|
|------|-----|------|
|
||||||
|
| 월세 | 150만 | 1,800만 |
|
||||||
|
| 재료비 | 180만 | 2,160만 |
|
||||||
|
| 직원급여 | 100만 | 1,200만 |
|
||||||
|
| 기타 | 20만 | 240만 |
|
||||||
|
| **합계** | **450만** | **5,400만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**기본 개념만으로도 충분**:
|
||||||
|
- 영수증을 어떻게 모으고
|
||||||
|
- 엑셀에 어떻게 적으면 되고
|
||||||
|
- 언제 신고하는지
|
||||||
|
|
||||||
|
→ 이 정도는 자신이 충분히 할 수 있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
### 겉으로는 간단해 보이지만...
|
||||||
|
|
||||||
|
**영수증 정리**:
|
||||||
|
- 소득세법 제29조에 따른 필요경비 판단
|
||||||
|
- 개인비와 사업비의 경계 명확화
|
||||||
|
- 환불, 수수료 처리의 세법 기준
|
||||||
|
- 영수증 없을 때 대체 증거 요건
|
||||||
|
|
||||||
|
**경비 분류**:
|
||||||
|
- 부가가치세 공제 대상 판단
|
||||||
|
- 종합소득세 vs 부가가치세 이중 영향
|
||||||
|
- 세법 변경에 따른 공제 범위 조정
|
||||||
|
- 일관성 검증 (연도별 처리 방식 통일)
|
||||||
|
|
||||||
|
**신고 절차**:
|
||||||
|
- 매년 바뀌는 신고 기한 (2025년 기준 변경사항)
|
||||||
|
- 가산세 계산 규칙 (국세기본법 제47조)
|
||||||
|
- 수정신고 vs 경정청구 판단
|
||||||
|
|
||||||
|
**현실**: 이 모든 걸 정확하게 챙기려면 시간이 많이 걸립니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 당신이 해야 할 일 vs 세무사가 해야 할 일
|
||||||
|
|
||||||
|
**당신이 할 수 있는 것**:
|
||||||
|
- 매일 영수증 모으기
|
||||||
|
- 월 1회 간단히 정리하기
|
||||||
|
|
||||||
|
**세무사가 정확하게 처리하는 것**:
|
||||||
|
- 세법 기준에 따른 필요경비 판단
|
||||||
|
- 공제 가능 여부 판단
|
||||||
|
- 매년 변경되는 세법 자동 적용
|
||||||
|
- 세무청 심사 대비 증거 정리
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 혼자할 때 | 세무사와 함께 |
|
||||||
|
|------|----------|-----------|
|
||||||
|
| **정확성** | 불안함 (실수 가능) | 확신 (법적 기준 준수) |
|
||||||
|
| **시간** | 월 10시간 | 월 1시간 |
|
||||||
|
| **세금** | 예측 불가 | 투명함 |
|
||||||
|
| **가산세** | 발생 가능성 높음 | 방지됨 |
|
||||||
|
| **세무사 비용** | 0원 | 연 100만 원 |
|
||||||
|
| **실제 효과** | 불안정 | 안정 + 절세 |
|
||||||
|
|
||||||
|
→ **기초는 배울 수 있지만, 정확성과 시간을 고려하면 전문가 도움이 효율적입니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 기초는 누구나 배울 수 있습니다**
|
||||||
|
**2. 하지만 세법이 복잡하고 매년 바뀝니다**
|
||||||
|
**3. 정확하게 하려면 전문가가 필요합니다**
|
||||||
|
|
||||||
|
당신의 상황에 따라 판단하고, 필요할 때 전문가와 상담하세요.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 2. 이번달 부가가치세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)',
|
||||||
|
'vat-report-monthly-guide',
|
||||||
|
$$
|
||||||
|
# 이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)
|
||||||
|
|
||||||
|
"어? 부가가치세 신고가 오늘까지라고?"
|
||||||
|
|
||||||
|
매달 20일까지 신고해야 하는 부가가치세. **하루만 늦어도 과태료가 나옵니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 편의점 "편의점 톤"을 운영하는 박준호님 (28세, 사업 2년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 광진구 자양동
|
||||||
|
- 월 매출: 약 1,000만 원
|
||||||
|
- 월 경비: 상품 구매 600만, 월세 200만, 직원비 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "신고 기한을 깜빡했어요"
|
||||||
|
→ 5월 21일에 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 부가가치세법 제25조 신고 기한 초과
|
||||||
|
- 국세기본법 제83조에 따른 과태료: 50,000원
|
||||||
|
- 하루만 늦어서 약 50,000원 손실
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 스마트폰 알람으로 20일 미리 알림
|
||||||
|
→ 자동으로 신고 준비
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 기한 내 신고 완료
|
||||||
|
- 과태료 없음
|
||||||
|
- 마음 편함
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 부가가치세 신고 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### 2025년 신고 일정
|
||||||
|
|
||||||
|
| 기간 | 신고 마감 | 납부 마감 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 1~2월 | 3월 20일 | 3월 25일 |
|
||||||
|
| 3~4월 | 5월 20일 | 5월 25일 |
|
||||||
|
| 5~6월 | 7월 20일 | 7월 25일 |
|
||||||
|
| 7~8월 | 9월 20일 | 9월 25일 |
|
||||||
|
|
||||||
|
### 부가세 계산 (간이과세 기준)
|
||||||
|
|
||||||
|
**편의점 월 1,000만 원 매출**:
|
||||||
|
- 간이과세율: 도매·소매업 3%
|
||||||
|
- 부가세 = 1,000만 × 3% = **300,000원/월**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**신고 기한과 기본 계산**:
|
||||||
|
- 매달 20일 신고해야 한다
|
||||||
|
- 간단한 계산으로 세금액 파악
|
||||||
|
- 필요한 서류 준비
|
||||||
|
|
||||||
|
→ 이 기본 개념만으로도 충분합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
### 겉으로는 간단해 보이지만...
|
||||||
|
|
||||||
|
**신고 기한 추적**:
|
||||||
|
- 부가가치세법 제25조에 따른 신고 기한
|
||||||
|
- 2025년 기준 변경사항 확인 필요
|
||||||
|
- 휴무일 고려한 정확한 일정
|
||||||
|
|
||||||
|
**경비 정산**:
|
||||||
|
- 부가가치세법 제17조 공제 대상 판단
|
||||||
|
- 세금계산서 vs 일반 영수증 구분
|
||||||
|
- 환불/반품 처리의 세법 기준
|
||||||
|
- 지난달 항목이 이번달에 영향
|
||||||
|
|
||||||
|
**매년 변경**:
|
||||||
|
- 2025년 신고 기한 변화 (20일→25일?)
|
||||||
|
- 새로운 공제 항목 추가
|
||||||
|
- 기준액 상향조정
|
||||||
|
|
||||||
|
**현실**: 매년 변경되는 규칙을 모두 따라가기 어렵습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 신고 기한 관리
|
||||||
|
|
||||||
|
**당신이 해야 할 일**:
|
||||||
|
- 카드 명세서 정리
|
||||||
|
- 영수증 모으기
|
||||||
|
|
||||||
|
**세무사가 자동으로 처리**:
|
||||||
|
- 신고 기한 알림 (놓칠 일 없음)
|
||||||
|
- 경비 정산 및 계산
|
||||||
|
- 기한 내 신고 보장
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 혼자할 때 | 세무사와 함께 |
|
||||||
|
|------|----------|-----------|
|
||||||
|
| **기한 관리** | 놓칠 수 있음 | 100% 보장 |
|
||||||
|
| **경비 정산** | 불완전 | 정확함 |
|
||||||
|
| **세금 계산** | 오류 가능성 | 세법 기준 준수 |
|
||||||
|
| **과태료** | 발생 가능 (50k+) | 없음 |
|
||||||
|
| **시간** | 월 3시간 | 월 30분 |
|
||||||
|
| **세무사 비용** | 0원 | 월 30만 원 |
|
||||||
|
|
||||||
|
→ **기한 하나만 놓쳐도 과태료가 나옵니다. 자동 관리가 효율적입니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 부가세 신고는 기한이 엄격합니다**
|
||||||
|
**2. 하루만 늦어도 과태료가 발생합니다**
|
||||||
|
**3. 자동 관리로 스트레스를 없앨 수 있습니다**
|
||||||
|
|
||||||
|
매달 반복되는 일이기 때문에, 한 번 체계를 만들면 편합니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 3. 프리랜서를 위한 종합소득세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서를 위한 종합소득세 신고 - 170만 원 절약하는 방법',
|
||||||
|
'freelancer-income-tax-guide',
|
||||||
|
$$
|
||||||
|
# 프리랜서를 위한 종합소득세 신고 - 170만 원 절약하는 방법
|
||||||
|
|
||||||
|
유튜버, 온라인 강사, 디자이너, 프리랜서...
|
||||||
|
|
||||||
|
이런 일을 하는 사람들은 회사에서 월급을 받지 않습니다. 대신 **자신이 벌은 돈을 직접 신고해야 합니다**. 이를 **종합소득세 신고**라고 합니다.
|
||||||
|
|
||||||
|
하지만 많은 프리랜서들이 **신고 기준도 모르고, 경비도 모르고, 나중에 큰 손해를 봅니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 실제 사례: 유튜버 "김팬더"님 (28세, 활동 4년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 월 평균 수입: 250만 원
|
||||||
|
- 연간 수입: 3,000만 원
|
||||||
|
- 주요 수입: 유튜브 광고 (80%), 브랜드 협찬 (20%)
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "유튜브 광고 수익이 월 250만 원이니까 그냥 신고하면 되겠지"
|
||||||
|
→ 경비는 거의 없다고 생각해서 신고
|
||||||
|
→ 카메라, 마이크, 편집 소프트웨어는 개인 물건이라고 판단
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 3,000만 원
|
||||||
|
- 종합소득세: 약 450만 원
|
||||||
|
- 경비 인정받지 못해 손해
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 카메라, 마이크, 소프트웨어를 경비로 인정받음
|
||||||
|
→ 인터넷비, 카페비, 강의료 등도 경비로 처리
|
||||||
|
→ 세무사와 함께 최적화된 신고
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 신고 소득: 2,200만 원 (경비 800만 원 공제)
|
||||||
|
- 종합소득세: 약 280만 원
|
||||||
|
- 이 사례에서는 약 170만 원 절약되었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧮 종합소득세 신고 계산 (상세)
|
||||||
|
|
||||||
|
### Step 1️⃣: 연간 수입 정리
|
||||||
|
|
||||||
|
| 수입 출처 | 월 | 연간 |
|
||||||
|
|---------|-----|------|
|
||||||
|
| 유튜브 광고 | 200만 | 2,400만 |
|
||||||
|
| 브랜드 협찬 | 50만 | 600만 |
|
||||||
|
| **합계** | **250만** | **3,000만** |
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산 (숨겨진 부분!)
|
||||||
|
|
||||||
|
많은 프리랜서들이 놓치는 경비들:
|
||||||
|
|
||||||
|
| 항목 | 월 | 연간 | 설명 |
|
||||||
|
|------|-----|------|------|
|
||||||
|
| 카메라/마이크 | 0 | 100만 | 초기 투자 (감가상각) |
|
||||||
|
| 편집 소프트웨어 | 6만 | 72만 | Adobe 구독 |
|
||||||
|
| 인터넷비 | 5만 | 60만 | 100% 사업용 |
|
||||||
|
| 카페비 | 20만 | 240만 | 브랜드 미팅 장소 |
|
||||||
|
| 강의료 | 0 | 120만 | 영상 제작 교육 |
|
||||||
|
| 책 구매 | 3만 | 36만 | 콘텐츠 연구 |
|
||||||
|
| 교통비 | 10만 | 120만 | 협찬사/브랜드 미팅 |
|
||||||
|
| **합계** | **44만** | **748만** |
|
||||||
|
|
||||||
|
### Step 3️⃣: 과세표준 계산
|
||||||
|
|
||||||
|
- 총 수입: 3,000만 원
|
||||||
|
- 경비 공제: 748만 원
|
||||||
|
- **과세표준**: 2,252만 원
|
||||||
|
- 기본공제: 160만 원 (2025년 기준)
|
||||||
|
- **최종 과세표준**: 2,092만 원
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금 계산 (2025년 기준)
|
||||||
|
|
||||||
|
| 구간 | 세율 |
|
||||||
|
|------|------|
|
||||||
|
| 1,200만 원 이하 | 6% |
|
||||||
|
| 1,200~4,600만 원 | 15% |
|
||||||
|
|
||||||
|
**계산**:
|
||||||
|
- 1,200만 × 6% = 72만 원
|
||||||
|
- 892만 × 15% = 134만 원
|
||||||
|
- **총 세금: 206만 원**
|
||||||
|
|
||||||
|
**만약 경비를 못 인정받았다면?**
|
||||||
|
- 세금: 450만 원
|
||||||
|
- **손해: 244만 원**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**기본 개념만 알면 충분**:
|
||||||
|
- 수입을 기록하기
|
||||||
|
- 기본 경비 이해하기
|
||||||
|
- 신고 기한 알기 (5월)
|
||||||
|
|
||||||
|
→ 이 기본 수준에서는 자신이 충분히 가능합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
### 겉으로는 간단해 보이지만...
|
||||||
|
|
||||||
|
**경비 판단의 복잡성**:
|
||||||
|
- 소득세법 제34조(필요경비)의 판단 기준
|
||||||
|
- 카메라는 감가상각인가 즉시 비용인가?
|
||||||
|
- 개인용 50%, 사업용 50%이면?
|
||||||
|
- 초기 투자는 몇 년에 걸쳐 계산?
|
||||||
|
- 중고 구매는 다른가?
|
||||||
|
|
||||||
|
**소득세법 적용**:
|
||||||
|
- 소득세법 제20조(종합소득) 정의
|
||||||
|
- 소득세법 제46조(특별공제) - 2025년 신규 제도
|
||||||
|
- 소득세법 제50조(세액 계산) - 기준율 변경
|
||||||
|
|
||||||
|
**세법 변경**:
|
||||||
|
- 2025년: 프리랜서 특별공제 신설
|
||||||
|
- 2025년: 청년 프리랜서 기본공제 200만 확대
|
||||||
|
- 매년 달라지는 기본공제액
|
||||||
|
|
||||||
|
**현실**: 이 모든 세법을 추적하며 정확하게 계산하기는 정말 어렵습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 경비 발굴과 세법 적용
|
||||||
|
|
||||||
|
**당신이 해야 할 일**:
|
||||||
|
- 수입 기록하기
|
||||||
|
- 영수증 모으기
|
||||||
|
|
||||||
|
**세무사가 정확하게 처리**:
|
||||||
|
- 모든 경비 발굴 및 인정 범위 판단
|
||||||
|
- 소득세법 기준에 따른 정확한 계산
|
||||||
|
- 2025년 신규 공제 및 지원 제도 적용
|
||||||
|
- 세무조사 대비 증거 정리
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
| 항목 | 혼자할 때 | 세무사와 함께 |
|
||||||
|
|------|----------|-----------|
|
||||||
|
| **경비 발굴** | 부분적 (놓침 많음) | 100% 인정 범위 내 적용 |
|
||||||
|
| **세금** | 450만 원 (손해) | 206만 원 (정확함) |
|
||||||
|
| **절세액** | 0 (손해) | 244만 원 (실제 절약) |
|
||||||
|
| **시간** | 연 40시간 | 연 4시간 |
|
||||||
|
| **신뢰도** | 불안함 | 확신 |
|
||||||
|
| **세무사 비용** | 0원 | 연 50만 원 |
|
||||||
|
| **순 효과** | -손해 | +194만 원 이득 |
|
||||||
|
|
||||||
|
→ **경비 처리만으로도 244만 원의 차이가 납니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 경비가 매우 중요합니다 (244만 원 차이)**
|
||||||
|
**2. 카메라, 소프트웨어, 교육비 등 모두 경비입니다**
|
||||||
|
**3. 세법이 복잡하고 매년 바뀝니다**
|
||||||
|
**4. 전문가와 함께하면 훨씬 효율적입니다**
|
||||||
|
|
||||||
|
기초는 배울 수 있지만, **숨겨진 경비를 찾고 세법을 정확하게 적용하는 것이 핵심입니다.**
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
@@ -0,0 +1,466 @@
|
|||||||
|
-- V024: Apply latest BLOG_TEMPLATE guidelines
|
||||||
|
-- Convert tables to readable lists
|
||||||
|
-- Simplify emojis (remove section headers like 📊, 🧮)
|
||||||
|
-- Keep customer-friendly language (1️⃣ 2️⃣ 3️⃣)
|
||||||
|
|
||||||
|
-- 1. 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유',
|
||||||
|
'accounting-mistakes-5',
|
||||||
|
$$
|
||||||
|
# 사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금이 얼마나 될까요?"
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 이 질문을 합니다. 기장은 **"돈이 들어오고 나가는 것을 기록하는 일"** - 간단해 보이죠. 하지만 실제로는 생각보다 복잡합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 실제 사례: 강남역 근처 카페를 운영하는 김 사장님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "너무 바빠서 영수증을 그냥 버렸어요"
|
||||||
|
→ 엑셀에 대충 적고
|
||||||
|
→ 세무청에 그냥 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조(수입금액의 계산) 규정에 따라 세무청에서 정정 통지
|
||||||
|
- 국세기본법 제47조(가산세)에 따른 가산세 부과
|
||||||
|
- 이 사례에서는 약 70만 원 정도의 추가 비용이 발생했습니다.
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 영수침을 정리하고
|
||||||
|
→ 매달 기본 기장을 했고
|
||||||
|
→ 세무사와 연 1회 상담
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제29조에 따른 정정 통지 없음
|
||||||
|
- 국세기본법 제47조 가산세 부과 없음
|
||||||
|
- 정확한 기장으로 이러한 상황을 방지할 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 단계별 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
월 경비 구성:
|
||||||
|
- 월세: 150만 원 (연 1,800만 원)
|
||||||
|
- 재료비: 180만 원 (연 2,160만 원)
|
||||||
|
- 직원급여: 100만 원 (연 1,200만 원)
|
||||||
|
- 기타: 20만 원 (연 240만 원)
|
||||||
|
- **월 합계: 450만 원**
|
||||||
|
- **연 합계: 5,400만 원**
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**기본 개념만으로도 충분**:
|
||||||
|
- 영수증을 어떻게 모으고
|
||||||
|
- 엑셀에 어떻게 적으면 되고
|
||||||
|
- 언제 신고하는지
|
||||||
|
|
||||||
|
→ 이 정도는 자신이 충분히 할 수 있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
### 겉으로는 간단해 보이지만...
|
||||||
|
|
||||||
|
**영수증 정리**:
|
||||||
|
- 소득세법 제29조에 따른 필요경비 판단
|
||||||
|
- 개인비와 사업비의 경계 명확화
|
||||||
|
- 환불, 수수료 처리의 세법 기준
|
||||||
|
- 영수증 없을 때 대체 증거 요건
|
||||||
|
|
||||||
|
**경비 분류**:
|
||||||
|
- 부가가치세 공제 대상 판단
|
||||||
|
- 종합소득세 vs 부가가치세 이중 영향
|
||||||
|
- 세법 변경에 따른 공제 범위 조정
|
||||||
|
- 일관성 검증 (연도별 처리 방식 통일)
|
||||||
|
|
||||||
|
**신고 절차**:
|
||||||
|
- 매년 바뀌는 신고 기한 (2025년 기준 변경사항)
|
||||||
|
- 가산세 계산 규칙 (국세기본법 제47조)
|
||||||
|
- 수정신고 vs 경정청구 판단
|
||||||
|
|
||||||
|
**현실**: 이 모든 걸 정확하게 챙기려면 시간이 많이 걸립니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 당신이 해야 할 일 vs 세무사가 해야 할 일
|
||||||
|
|
||||||
|
**당신이 할 수 있는 것**:
|
||||||
|
- 매일 영수증 모으기
|
||||||
|
- 월 1회 간단히 정리하기
|
||||||
|
|
||||||
|
**세무사가 정확하게 처리하는 것**:
|
||||||
|
- 세법 기준에 따른 필요경비 판단
|
||||||
|
- 공제 가능 여부 판단
|
||||||
|
- 매년 변경되는 세법 자동 적용
|
||||||
|
- 세무청 심사 대비 증거 정리
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
**정확성**:
|
||||||
|
- 혼자: 불안함 (실수 가능)
|
||||||
|
- 세무사: 확신 (법적 기준 준수)
|
||||||
|
|
||||||
|
**시간**:
|
||||||
|
- 혼자: 월 10시간
|
||||||
|
- 세무사: 월 1시간
|
||||||
|
|
||||||
|
**세금 투명성**:
|
||||||
|
- 혼자: 예측 불가
|
||||||
|
- 세무사: 투명함
|
||||||
|
|
||||||
|
**가산세 위험**:
|
||||||
|
- 혼자: 발생 가능성 높음
|
||||||
|
- 세무사: 방지됨
|
||||||
|
|
||||||
|
**비용**:
|
||||||
|
- 혼자: 0원
|
||||||
|
- 세무사: 연 100만 원
|
||||||
|
|
||||||
|
**결론**: 기초는 배울 수 있지만, 정확성과 시간을 고려하면 전문가 도움이 효율적입니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 기초는 누구나 배울 수 있습니다**
|
||||||
|
**2. 하지만 세법이 복잡하고 매년 바뀝니다**
|
||||||
|
**3. 정확하게 하려면 전문가가 필요합니다**
|
||||||
|
|
||||||
|
당신의 상황에 따라 판단하고, 필요할 때 전문가와 상담하세요.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 2. 이번달 부가가치세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'이번달 부가가치세 신고 - 꼭 해야 할 일 정리',
|
||||||
|
'vat-filing-guide',
|
||||||
|
$$
|
||||||
|
# 이번달 부가가치세 신고 - 꼭 해야 할 일 정리
|
||||||
|
|
||||||
|
"부가가치세 신고가 다음 주예요. 뭘 준비해야 하나요?"
|
||||||
|
|
||||||
|
부가가치세 신고는 **"3개월간 벌어들인 세금을 국가에 내는 일"** - 의무입니다. 부가가치세법 제25조에 따르면, 해당 기간의 매출과 경비를 정확하게 신고해야 합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 실제 사례: 온라인 쇼핑몰을 운영하는 이 대표님 (29세, 사업 2년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 월 매출: 약 1,500만 원
|
||||||
|
- 월 경비: 상품 구입비 900만, 배송료 150만, 기타 100만 원
|
||||||
|
- 신고 대상: 3개월마다 신고 필요
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "신고 기한이 언제인지 몰랐어요"
|
||||||
|
→ 필요경비와 공제세액을 잘못 계산했어요
|
||||||
|
→ 신고 기한을 놓쳤어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 부가가치세법 제25조 위반
|
||||||
|
- 가산세(무신고 가산) 부과
|
||||||
|
- 이 사례에서는 약 50만 원 정도의 추가 납부
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 신고 기한을 달력에 표시했어요
|
||||||
|
→ 세무사와 월 1회 점검했어요
|
||||||
|
→ 정시 신고했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 부가가치세법 제25조 정시 신고
|
||||||
|
- 가산세 부과 없음
|
||||||
|
- 사업에만 집중할 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 단계별 신고 준비 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출액 정리
|
||||||
|
3개월간의 모든 매출 합계: 약 4,500만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
월평균 경비:
|
||||||
|
- 상품 구입비: 900만 원 (3개월 2,700만 원)
|
||||||
|
- 배송료: 150만 원 (3개월 450만 원)
|
||||||
|
- 기타 경비: 100만 원 (3개월 300만 원)
|
||||||
|
- **3개월 합계: 3,450만 원**
|
||||||
|
|
||||||
|
### Step 3️⃣: 공제 대상 파악
|
||||||
|
공제세액 = 경비에 포함된 부가가치세
|
||||||
|
|
||||||
|
**공제 가능한 항목**:
|
||||||
|
- 상품 구입 시 부가세 (부가가치세법 제17조)
|
||||||
|
- 배송료의 부가세
|
||||||
|
- 영수증 필수 (발행자별로 증명)
|
||||||
|
|
||||||
|
**공제 불가 항목**:
|
||||||
|
- 국세 기본법에 따른 특정 경비
|
||||||
|
|
||||||
|
### Step 4️⃣: 납부액 계산
|
||||||
|
매출액 4,500만 × 10% = 450만 원 (부가세)
|
||||||
|
경비 공제액 345만 × 10% = 34.5만 원 (공제세액)
|
||||||
|
**납부액**: 450만 - 34.5만 ≈ **415.5만 원**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**기본 개념만으로도 충분**:
|
||||||
|
- 부가가치세가 뭔지
|
||||||
|
- 언제 신고하는지
|
||||||
|
- 어떤 서류가 필요한지
|
||||||
|
|
||||||
|
→ 기초 개념만 알아도 큰 도움이 됩니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
**신고 기한**:
|
||||||
|
- 부가가치세법 제25조에 따른 신고 기한
|
||||||
|
- 매 분기마다 다른 마감일
|
||||||
|
- 기한을 놓치면 무신고 가산세 발생
|
||||||
|
|
||||||
|
**공제 판정**:
|
||||||
|
- 어떤 영수증이 공제되는지
|
||||||
|
- 국세 기본법 제83조에 따른 결정
|
||||||
|
- 발행자의 세무 상태에 따른 영향
|
||||||
|
|
||||||
|
**복합 사업**:
|
||||||
|
- 면세 사업과 과세 사업을 함께 하면?
|
||||||
|
- 공제 비율 계산이 복잡함
|
||||||
|
- 연도별 조정 필요
|
||||||
|
|
||||||
|
**현실**: 정확하게 하려면 세법 이해가 필수입니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 당신이 해야 할 일 vs 세무사가 해야 할 일
|
||||||
|
|
||||||
|
**당신이 할 수 있는 것**:
|
||||||
|
- 영수증 수집 및 분류
|
||||||
|
- 매출액 합계 계산
|
||||||
|
|
||||||
|
**세무사가 정확하게 처리하는 것**:
|
||||||
|
- 공제 가능 여부 판단 (부가가치세법 제17조)
|
||||||
|
- 신고 기한 관리
|
||||||
|
- 최적 신고 방식 결정
|
||||||
|
- 가산세 방지
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
**정시 신고 여부**:
|
||||||
|
- 혼자: 기한 놓칠 가능성 높음
|
||||||
|
- 세무사: 100% 정시 신고
|
||||||
|
|
||||||
|
**공제액 정확성**:
|
||||||
|
- 혼자: 과다 공제 또는 과소 공제
|
||||||
|
- 세무사: 세법 기준 준수
|
||||||
|
|
||||||
|
**가산세 위험**:
|
||||||
|
- 혼자: 무신고 가산세 발생 가능 (50~100만 원)
|
||||||
|
- 세무사: 가산세 방지
|
||||||
|
|
||||||
|
**신고 비용**:
|
||||||
|
- 혼자: 0원 (시간 비용 제외)
|
||||||
|
- 세무사: 분기 30만 원 정도
|
||||||
|
|
||||||
|
**결론**: 한 분기 가산세가 세무사 비용보다 많이 나올 수 있습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 부가가치세는 의무입니다**
|
||||||
|
**2. 기한 하나를 놓치면 가산세가 발생합니다**
|
||||||
|
**3. 정확하게 하려면 전문가 도움이 효율적입니다**
|
||||||
|
|
||||||
|
신고 기한이 다가오면 미리 세무사와 상담하세요.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
|
-- 3. 프리랜서를 위한 종합소득세 신고
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, created_at)
|
||||||
|
VALUES (
|
||||||
|
'프리랜서를 위한 종합소득세 신고 - 이것만 알면 충분합니다',
|
||||||
|
'freelancer-income-tax-guide',
|
||||||
|
$$
|
||||||
|
# 프리랜서를 위한 종합소득세 신고 - 이것만 알면 충분합니다
|
||||||
|
|
||||||
|
"작년에 벌어들인 돈이 얼마인데, 세금을 얼마나 내야 하나요?"
|
||||||
|
|
||||||
|
프리랜서는 **"본인이 일한 만큼 벌어들인 소득에 세금을 내는"** 구조입니다. 소득세법 제20조에 따르면, 사업소득은 매해 5월에 신고합니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 실제 사례: 웹 디자이너 박 프리랜서님 (31세, 프리랜서 4년차)
|
||||||
|
|
||||||
|
**기본 정보** (예시 사례):
|
||||||
|
- 월 평균 수입: 약 350만 원
|
||||||
|
- 연간 수입: 약 4,200만 원
|
||||||
|
- 월 경비: 자료실비 50만, 소프트웨어 라이선스 30만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ "수입은 기록했는데 경비는 안 챙겼어요"
|
||||||
|
→ 영수증 없이 신고했어요
|
||||||
|
→ "이 정도는 작은 금액이니까..."라고 생각했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제46조에 따른 필요경비 과소 인정
|
||||||
|
- 소득세법 제50조의 기본공제 조정
|
||||||
|
- 이 사례에서는 약 100만 원 정도의 추가 납세
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ 경비도 정리하고
|
||||||
|
→ 영수증을 모아두고
|
||||||
|
→ 세무사와 상담했어요
|
||||||
|
|
||||||
|
**결과**:
|
||||||
|
- 소득세법 제46조 기준에 따른 정확한 필요경비 인정
|
||||||
|
- 소득세 정확하게 계산됨
|
||||||
|
- 본인이 낼 세금의 액수를 미리 알 수 있었습니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 단계별 신고 준비 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1️⃣: 연간 사업소득 정리
|
||||||
|
월 350만 원 × 12개월 = 연 4,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 필요경비 계산
|
||||||
|
|
||||||
|
연간 경비:
|
||||||
|
- 자료실비: 50만 원 × 12개월 = 600만 원
|
||||||
|
- 소프트웨어 라이선스: 30만 원 × 12개월 = 360만 원
|
||||||
|
- 기타 경비 (통신비, 교육): 100만 원
|
||||||
|
- **연간 경비 합계: 1,060만 원**
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익 계산
|
||||||
|
4,200만 원 - 1,060만 원 = **3,140만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 소득세 계산
|
||||||
|
소득세법 제50조에 따른 기본공제 적용
|
||||||
|
개인 기본공제: 150만 원
|
||||||
|
**과세표준**: 3,140만 - 150만 = 2,990만 원
|
||||||
|
**예상 세금**: 약 300만 원~350만 원 (세율 6~15%)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ 이 정도는 누구나 배울 수 있어요
|
||||||
|
|
||||||
|
**기본 개념만으로도 충분**:
|
||||||
|
- 언제 신고하는지
|
||||||
|
- 어떤 경비를 챙기는지
|
||||||
|
- 대략적인 세금 액수
|
||||||
|
|
||||||
|
→ 기초를 알면 신고 준비가 훨씬 쉬워집니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ 하지만 현실은 이렇게 복잡해요
|
||||||
|
|
||||||
|
**경비 인정 기준**:
|
||||||
|
- 소득세법 제46조에 따른 필요경비 판단
|
||||||
|
- 업무 관련성 입증 필요
|
||||||
|
- 개인비와의 구분
|
||||||
|
- 영수증 없을 때 대체 입증
|
||||||
|
|
||||||
|
**공제 판정**:
|
||||||
|
- 소득세법 제50조 기본공제
|
||||||
|
- 부양가족 공제 추가 가능
|
||||||
|
- 연도별 공제 기준 변경
|
||||||
|
- 종합소득 다른 소득과의 연계
|
||||||
|
|
||||||
|
**신고 방식**:
|
||||||
|
- 분리과세 vs 종합과세 선택
|
||||||
|
- 손실 이월공제 규칙
|
||||||
|
- 지방소득세 연동
|
||||||
|
|
||||||
|
**현실**: 매년 세법이 바뀌고, 개인의 상황에 따라 신고 방식이 달라집니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ 그래서 전문가 도움이 필요합니다
|
||||||
|
|
||||||
|
### 당신이 해야 할 일 vs 세무사가 해야 할 일
|
||||||
|
|
||||||
|
**당신이 할 수 있는 것**:
|
||||||
|
- 통장 내역 정리
|
||||||
|
- 경비 영수증 모으기
|
||||||
|
- 월별 수입액 기록
|
||||||
|
|
||||||
|
**세무사가 정확하게 처리하는 것**:
|
||||||
|
- 경비 인정 가능 범위 판단 (소득세법 제46조)
|
||||||
|
- 최적 신고 방식 결정
|
||||||
|
- 공제 항목 최대화 (소득세법 제50조)
|
||||||
|
- 세무청 심사 대비
|
||||||
|
|
||||||
|
### 비용 효과 분석
|
||||||
|
|
||||||
|
**경비 인정**:
|
||||||
|
- 혼자: 인정 불가 부분 많음 (100만 원 손실)
|
||||||
|
- 세무사: 정확한 인정 (절세 효과)
|
||||||
|
|
||||||
|
**신고 정확성**:
|
||||||
|
- 혼자: 계산 오류 가능성
|
||||||
|
- 세무사: 법적 기준 준수
|
||||||
|
|
||||||
|
**세금 부담**:
|
||||||
|
- 혼자: 예측 불가, 높을 가능성
|
||||||
|
- 세무사: 최적화된 금액
|
||||||
|
|
||||||
|
**세무사 비용**:
|
||||||
|
- 혼자: 0원
|
||||||
|
- 세무사: 연 100~150만 원
|
||||||
|
|
||||||
|
**결론**: 세무사 비용보다 절세 효과가 더 크면 전문가 도움이 이득입니다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 꼭 기억하세요!
|
||||||
|
|
||||||
|
**1. 경비를 정리하면 세금이 줄어듭니다**
|
||||||
|
**2. 하지만 경비 인정 기준이 복잡합니다 (소득세법 제46조)**
|
||||||
|
**3. 정확하게 하려면 전문가 도움이 필수입니다**
|
||||||
|
|
||||||
|
5월 신고 전에 미리 세무사와 상담하세요. 미리 준비하면 더 많은 절세 기회를 놓치지 않습니다.
|
||||||
|
$$,
|
||||||
|
1,
|
||||||
|
true,
|
||||||
|
NOW()
|
||||||
|
) ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,299 @@
|
|||||||
|
-- V026: 기초 3개 포스트 추가 + 모든 12개에 카테고리 할당
|
||||||
|
-- 카테고리 배치 (각 3개씩):
|
||||||
|
-- cat 1 (사업자 세무): 사업자 기장, 소상공인, 스마트스토어
|
||||||
|
-- cat 2 (부동산 세금): 월세, 자녀 증여세
|
||||||
|
-- cat 3 (종합소득세): 프리랜서 종소세, 프리랜서 경비, 종소세 가이드
|
||||||
|
-- cat 4 (부가가치세): 부가세 신고, 부가세 기한, 사업자 등록
|
||||||
|
-- cat 5 (가족자산): 연말정산 환급
|
||||||
|
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, seo_title, seo_description, tags, created_at, updated_at) VALUES
|
||||||
|
|
||||||
|
-- 기초 3개 포스트 (V022, V024)
|
||||||
|
('사업자 기장 시 자주 하는 실수 5가지 - 혼자 하기 어려운 이유', 'accounting-mistakes', $$# 사업자 기장 시 자주 하는 실수 5가지
|
||||||
|
|
||||||
|
많은 소규모 사업자들이 "돈이 들어오고 나가는 것을 기록하는 일"은 간단해 보이지만, 실제로는 악마가 디테일에 숨어있습니다.
|
||||||
|
|
||||||
|
## 단계별 계산 (2025년 기준)
|
||||||
|
|
||||||
|
### Step 1: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2: 경비 계산
|
||||||
|
- 월세: 150만 원 (연 1,800만 원)
|
||||||
|
- 재료비: 180만 원 (연 2,160만 원)
|
||||||
|
- 직원급여: 100만 원 (연 1,200만 원)
|
||||||
|
- 기타: 20만 원 (연 240만 원)
|
||||||
|
- 월 합계: 450만 원 / 연 합계: 5,400만 원
|
||||||
|
|
||||||
|
### Step 3: 순이익
|
||||||
|
7,200만 - 5,400만 = 1,800만 원
|
||||||
|
|
||||||
|
### Step 4: 세금 (2025년 기준)
|
||||||
|
- 기본공제: 160만 원
|
||||||
|
- 과세표준: 1,640만 원
|
||||||
|
- 세율: 6%
|
||||||
|
- 세금: 약 98만 원/년
|
||||||
|
|
||||||
|
## 악마는 디테일에 숨어있습니다
|
||||||
|
|
||||||
|
### 1. 영수증 정리
|
||||||
|
겉으로는: 영수증을 모으기만 하면 돼
|
||||||
|
현실: 소득세법 제34조에서 인정되는 사업비만 공제 가능
|
||||||
|
|
||||||
|
### 2. 매출과 경비 기록
|
||||||
|
겉으로는: 엑셀에 숫자만 입력하면 돼
|
||||||
|
현실: 부가세와의 연계, 수정신고 규정, 기한 후 신고 가산세 고려
|
||||||
|
|
||||||
|
### 3. 세금 확정
|
||||||
|
겉으로는: 기장만 잘하면 끝
|
||||||
|
현실: 절세 전략, 연도별 일관성, 세무조사 대비, 이의신청 절차
|
||||||
|
|
||||||
|
## 올바른 기장 vs 하면 안 되는 것
|
||||||
|
|
||||||
|
### 해야 할 것
|
||||||
|
1. 영수증 정리 - 5년 보관 의무
|
||||||
|
2. 기본 기록 - 소득세법 제164조 규정
|
||||||
|
3. 연 1회 점검 - 세무사와 상담
|
||||||
|
4. 정확한 신고 - 소득세법 제46조 준수
|
||||||
|
|
||||||
|
### 하면 안 되는 것
|
||||||
|
1. 영수증 버리기 - 증거 부족
|
||||||
|
2. 개인비와 섞기 - 세법 위반
|
||||||
|
3. 신고 늦추기 - 가산세 부과
|
||||||
|
4. 과하게 깎기 - 세무조사 대상
|
||||||
|
|
||||||
|
## 결론
|
||||||
|
|
||||||
|
기초는 배울 수 있지만, 세법의 복잡성, 매년 변경되는 기준, 정확한 해석 때문에 세무사의 도움이 필요합니다.$$, 1, true, 'SEO Title', 'SEO Description', '사업자,기장,세무', NOW(), NOW()),
|
||||||
|
|
||||||
|
('이번달 부가가치세 신고 - 너무 늦지 마세요! (D-day 계산)', 'vat-report-guide', $$# 부가가치세 신고 - D-day 계산
|
||||||
|
|
||||||
|
많은 사업자들이 신고 기한을 놓칩니다. 부가가치세법 제25조에 따르면 신고 기한은 25일(2025년 개정). 하루만 늦어도 국세기본법 제47조 가산세가 발생합니다!
|
||||||
|
|
||||||
|
## 2025년 신고 일정
|
||||||
|
|
||||||
|
| 기간 | 신고 마감 | 납부 마감 |
|
||||||
|
|------|----------|----------|
|
||||||
|
| 1~2월 | 3월 25일 | 3월 31일 |
|
||||||
|
| 3~4월 | 5월 25일 | 5월 31일 |
|
||||||
|
| 5~6월 | 7월 25일 | 7월 31일 |
|
||||||
|
| 7~8월 | 9월 25일 | 9월 30일 |
|
||||||
|
|
||||||
|
## 부가세 계산 (간이과세 기준)
|
||||||
|
|
||||||
|
월 1,000만 원 매출 기준:
|
||||||
|
- 간이과세율: 도매·소매업 3%
|
||||||
|
- 부가세 = 1,000만 × 3% = 300,000원/월
|
||||||
|
|
||||||
|
## 하지만 복잡한 부분들
|
||||||
|
|
||||||
|
- 카드 수수료 처리
|
||||||
|
- 현금 판매 기록
|
||||||
|
- 환불 처리 규정
|
||||||
|
- 세금계산서 vs 일반 영수증
|
||||||
|
- 3개월 전 환불 공제 불가
|
||||||
|
|
||||||
|
이런 디테일들 때문에 세무사가 필요합니다.$$, 4, true, 'SEO Title', 'SEO Description', '부가가치세,신고,세금', NOW(), NOW()),
|
||||||
|
|
||||||
|
('프리랜서를 위한 종합소득세 신고 - 정확한 경비 처리 가이드', 'freelancer-tax-guide', $$# 프리랜서를 위한 종합소득세 신고
|
||||||
|
|
||||||
|
유튜버, 온라인 강사, 디자이너, 프리랜서... 자신이 벌은 돈을 직접 신고해야 합니다. 종합소득세 신고(소득세법 제20조)입니다.
|
||||||
|
|
||||||
|
## 실제 사례: 유튜버 (월 250만 원 수입)
|
||||||
|
|
||||||
|
### 실패 사례
|
||||||
|
- 신고 소득: 3,000만 원
|
||||||
|
- 기본공제: 160만 원
|
||||||
|
- 세금: 약 450만 원
|
||||||
|
|
||||||
|
### 성공 사례 (정확한 경비 처리)
|
||||||
|
- 신고 소득: 2,200만 원 (경비 800만 원 공제)
|
||||||
|
- 기본공제: 160만 원
|
||||||
|
- 세금: 약 280만 원
|
||||||
|
- **절약액: 약 170만 원**
|
||||||
|
|
||||||
|
## 종합소득세 계산 (2025년)
|
||||||
|
|
||||||
|
### 연간 수입
|
||||||
|
| 수입 출처 | 연간 |
|
||||||
|
|---------|------|
|
||||||
|
| 유튜브 광고 | 2,400만 |
|
||||||
|
| 브랜드 협찬 | 600만 |
|
||||||
|
| 합계 | 3,000만 |
|
||||||
|
|
||||||
|
### 경비 (소득세법 제34조 기준)
|
||||||
|
| 항목 | 연간 |
|
||||||
|
|------|------|
|
||||||
|
| 카메라/마이크 | 100만 |
|
||||||
|
| 소프트웨어 | 72만 |
|
||||||
|
| 인터넷비 | 60만 |
|
||||||
|
| 카페비 | 240만 |
|
||||||
|
| 강의료 | 120만 |
|
||||||
|
| 책 구매 | 36만 |
|
||||||
|
| 교통비 | 120만 |
|
||||||
|
| 합계 | 748만 |
|
||||||
|
|
||||||
|
### 과세표준
|
||||||
|
- 총 수입: 3,000만 원
|
||||||
|
- 경비: 748만 원
|
||||||
|
- 과세표준: 2,252만 원
|
||||||
|
- 기본공제: 160만 원
|
||||||
|
- 최종 과세표준: 2,092만 원
|
||||||
|
|
||||||
|
## 많은 프리랜서가 놓치는 부분
|
||||||
|
|
||||||
|
1. 어떤 경비가 인정되는가? (소득세법 제34조)
|
||||||
|
2. 매년 기준이 바뀐다 (2025년 기본공제 160만)
|
||||||
|
3. 세법 개정사항을 어떻게 반영하나?
|
||||||
|
4. 세무조사에 대비해야 한다
|
||||||
|
|
||||||
|
이런 것들 때문에 세무사와 함께하는 것이 효율적입니다.$$, 3, true, 'SEO Title', 'SEO Description', '종합소득세,프리랜서,경비', NOW(), NOW()),
|
||||||
|
|
||||||
|
-- 추가 9개 포스트 (V025) - category_id 할당
|
||||||
|
('프리랜서가 놓친 경비 5가지 - 이것도 인정될까요?', 'freelancer-expenses-5', $$# 프리랜서가 놓친 경비 5가지
|
||||||
|
|
||||||
|
프리랜서의 일반적인 경비:
|
||||||
|
- 통신비: 인터넷, 휴대폰 요금
|
||||||
|
- 교육비: 업무 관련 강좌, 자격증
|
||||||
|
- 차량유지비: 업무용 차량 유지
|
||||||
|
- 소프트웨어: 업무용 프로그램
|
||||||
|
- 사무실비: 작업 공간 임차료
|
||||||
|
|
||||||
|
하지만 무엇이 "필요경비"인지는 복잡합니다. 소득세법 제34조를 정확하게 이해해야 합니다.$$, 3, true, 'SEO Title', 'SEO Description', '프리랜서,경비', NOW(), NOW()),
|
||||||
|
|
||||||
|
('월세 신고하는 방법 - 환급받을 수 있는 금액이 있습니다', 'monthly-rent-deduction', $$# 월세 신고하는 방법
|
||||||
|
|
||||||
|
소득세법 제59조의2에 따르면 월세세액공제가 있습니다.
|
||||||
|
|
||||||
|
## 월세세액공제 조건 (2025년 기준)
|
||||||
|
- 본인 거주 주택의 월세: 연 750만 원 한도
|
||||||
|
- 필요 서류: 임대차계약서, 월세 납부 증빙
|
||||||
|
- 환급액: 연 월세의 10% (최대 75만 원)
|
||||||
|
|
||||||
|
예시: 월 60만 원 월세
|
||||||
|
- 연 월세: 720만 원
|
||||||
|
- 환급액: 72만 원
|
||||||
|
|
||||||
|
신고하지 않으면 한 푼도 못 받습니다!$$, 2, true, 'SEO Title', 'SEO Description', '월세,세액공제', NOW(), NOW()),
|
||||||
|
|
||||||
|
('자녀 증여세 계산하기 - 기초공제를 모르면 손해봅니다', 'child-gift-tax', $$# 자녀 증여세 계산하기
|
||||||
|
|
||||||
|
상속세및증여세법 제13조에 따르면 기초공제가 있습니다.
|
||||||
|
|
||||||
|
## 증여세 기초공제 (2025년 기준)
|
||||||
|
- 직계 자손: 1인당 기초공제 많음
|
||||||
|
- 조건: 증여자와 수증자 관계 증명
|
||||||
|
|
||||||
|
## 조세 전략
|
||||||
|
- 시간 분산 (연간 공제 한도 활용)
|
||||||
|
- 여러 자녀에게 분산
|
||||||
|
- 공제 시기 선택
|
||||||
|
|
||||||
|
정확한 계산이 필요합니다.$$, 2, true, 'SEO Title', 'SEO Description', '증여세,상속세', NOW(), NOW()),
|
||||||
|
|
||||||
|
('사업자 등록 타이밍 - 너무 빨라도, 늦어도 손해입니다', 'business-registration-timing', $$# 사업자 등록 타이밍
|
||||||
|
|
||||||
|
소득세법 제2조에 따르면 사업소득의 인정 기준이 명확합니다.
|
||||||
|
|
||||||
|
## 사업자 등록의 효과
|
||||||
|
- 부가가치세 신고 의무
|
||||||
|
- 세금 공제 가능
|
||||||
|
- 신용 기록 형성
|
||||||
|
|
||||||
|
## 언제 등록해야 하나?
|
||||||
|
- 너무 빨리: 불필요한 부가세 부담
|
||||||
|
- 너무 늦게: 소급 신고로 가산세
|
||||||
|
|
||||||
|
정확한 타이밍이 중요합니다.$$, 4, true, 'SEO Title', 'SEO Description', '사업자등록', NOW(), NOW()),
|
||||||
|
|
||||||
|
('소상공인 간단 기장 - 엑셀 + 영수증으로 충분합니다', 'small-business-accounting', $$# 소상공인 간단 기장
|
||||||
|
|
||||||
|
소득세법 제29조에 따르면 간단 기장도 인정됩니다.
|
||||||
|
|
||||||
|
## 간단 기장 방법
|
||||||
|
- 엑셀에 매출/경비 기록
|
||||||
|
- 영수증 보관
|
||||||
|
- 연 1회 세무사와 정산
|
||||||
|
|
||||||
|
## 필수 항목
|
||||||
|
- 날짜
|
||||||
|
- 거래처
|
||||||
|
- 금액
|
||||||
|
- 증빙 서류 보관
|
||||||
|
|
||||||
|
이 정도면 충분합니다.$$, 1, true, 'SEO Title', 'SEO Description', '소상공인,기장', NOW(), NOW()),
|
||||||
|
|
||||||
|
('스마트스토어 판매자 세무 - 플랫폼 수입도 세금이 필요합니다', 'smartstore-tax', $$# 스마트스토어 판매자 세무
|
||||||
|
|
||||||
|
플랫폼 판매 수입도 세금 신고 대상입니다.
|
||||||
|
|
||||||
|
## 신고 방법
|
||||||
|
- 플랫폼에서 제공하는 정산 내역서
|
||||||
|
- 소득세법 제20조 기타소득 또는 사업소득
|
||||||
|
- 연 300만 원 이상 시 신고 의무
|
||||||
|
|
||||||
|
## 경비 처리
|
||||||
|
- 상품 구매
|
||||||
|
- 수수료
|
||||||
|
- 배송비
|
||||||
|
- 광고비
|
||||||
|
|
||||||
|
정확한 분류가 필요합니다.$$, 1, true, 'SEO Title', 'SEO Description', '스마트스토어,세무', NOW(), NOW()),
|
||||||
|
|
||||||
|
('부가가치세 신고 기한 - 2일만 늦어도 가산세입니다', 'vat-deadline', $$# 부가가치세 신고 기한
|
||||||
|
|
||||||
|
부가가치세법 제25조: 신고 기한은 25일(2025년 개정)입니다.
|
||||||
|
|
||||||
|
## 신고 지체 시 페널티
|
||||||
|
- 국세기본법 제47조: 1일당 0.2% 가산세
|
||||||
|
- 하루만 늦어도 발생
|
||||||
|
|
||||||
|
## 신고 방법
|
||||||
|
- 국세청 홈택스
|
||||||
|
- 세무사 대리
|
||||||
|
- 회계프로그램
|
||||||
|
|
||||||
|
기한을 절대 넘기면 안 됩니다.$$, 4, true, 'SEO Title', 'SEO Description', '부가가치세,기한', NOW(), NOW()),
|
||||||
|
|
||||||
|
('종합소득세 신고 완벽 가이드 - 5월 신고로 연간 세금이 결정됩니다', 'income-tax-complete-guide', $$# 종합소득세 신고 완벽 가이드
|
||||||
|
|
||||||
|
소득세법 제19조: 종합소득세 신고는 매년 5월입니다.
|
||||||
|
|
||||||
|
## 신고 대상
|
||||||
|
- 사업소득 발생 개인
|
||||||
|
- 기타소득 연 300만 원 이상
|
||||||
|
- 근로소득 이외의 소득 발생자
|
||||||
|
|
||||||
|
## 필요 서류
|
||||||
|
- 소득 입증 서류
|
||||||
|
- 경비 증빙 자료
|
||||||
|
- 공제 관련 서류
|
||||||
|
|
||||||
|
## 신고 절차
|
||||||
|
1. 소득 정리
|
||||||
|
2. 경비 계산
|
||||||
|
3. 과세표준 계산
|
||||||
|
4. 세금 계산
|
||||||
|
5. 신고 및 납부
|
||||||
|
|
||||||
|
정확한 신고가 중요합니다.$$, 3, true, 'SEO Title', 'SEO Description', '종합소득세,신고', NOW(), NOW()),
|
||||||
|
|
||||||
|
('연말정산 환급 최대화 - 놓친 공제 하나가 수십만 원입니다', 'year-end-settlement-tips', $$# 연말정산 환급 최대화
|
||||||
|
|
||||||
|
소득세법 제163조: 연말정산은 매년 2월입니다.
|
||||||
|
|
||||||
|
## 주요 공제 항목
|
||||||
|
- 교육비: 자녀 교육비 (연 900만 원 한도)
|
||||||
|
- 의료비: 총 급여 3% 초과분만
|
||||||
|
- 신용카드: 총 급여 25% 초과분만
|
||||||
|
- 기부금: 한도 있음
|
||||||
|
|
||||||
|
## 환급받기
|
||||||
|
- 공제 항목 확인
|
||||||
|
- 증빙 서류 준비
|
||||||
|
- 회사에 제출
|
||||||
|
- 2월에 환급
|
||||||
|
|
||||||
|
놓친 공제가 있으면 손해입니다.$$, 5, true, 'SEO Title', 'SEO Description', '연말정산,환급', NOW(), NOW())
|
||||||
|
ON CONFLICT (slug) DO NOTHING;
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
ALTER TABLE blog_posts
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
|
||||||
|
|
||||||
|
DROP INDEX IF EXISTS idx_blog_slug;
|
||||||
|
ALTER TABLE blog_posts DROP CONSTRAINT IF EXISTS blog_posts_slug_key;
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS ux_blog_posts_slug_active
|
||||||
|
ON blog_posts (slug)
|
||||||
|
WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_blog_slug_active
|
||||||
|
ON blog_posts (slug)
|
||||||
|
WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_blog_published_active
|
||||||
|
ON blog_posts (is_published, published_at DESC)
|
||||||
|
WHERE deleted_at IS NULL;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_blog_category_active
|
||||||
|
ON blog_posts (category_id)
|
||||||
|
WHERE deleted_at IS NULL;
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
-- Seed and normalize admin common codes.
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('INQUIRY_SERVICE_TYPE', '사업자세무', '사업자세무', 10),
|
||||||
|
('INQUIRY_SERVICE_TYPE', '부동산세금', '부동산세금', 20),
|
||||||
|
('INQUIRY_SERVICE_TYPE', '가족자산', '가족자산', 30),
|
||||||
|
('INQUIRY_SERVICE_TYPE', '기타', '기타', 40),
|
||||||
|
|
||||||
|
('INQUIRY_STATUS', 'new', '신규', 10),
|
||||||
|
('INQUIRY_STATUS', 'consulting', '상담중', 20),
|
||||||
|
('INQUIRY_STATUS', 'contracted', '계약완료', 30),
|
||||||
|
('INQUIRY_STATUS', 'rejected', '거절', 40),
|
||||||
|
('INQUIRY_STATUS', 'closed', '종결', 50),
|
||||||
|
|
||||||
|
('CLIENT_STATUS', 'active', '활성', 10),
|
||||||
|
('CLIENT_STATUS', 'inactive', '비활성', 20),
|
||||||
|
|
||||||
|
('CLIENT_SERVICE_TYPE', '기장', '기장', 10),
|
||||||
|
('CLIENT_SERVICE_TYPE', '부동산', '부동산', 20),
|
||||||
|
('CLIENT_SERVICE_TYPE', '증여상속', '증여·상속', 30),
|
||||||
|
('CLIENT_SERVICE_TYPE', '종합소득세', '종합소득세', 40),
|
||||||
|
('CLIENT_SERVICE_TYPE', '법인세', '법인세', 50),
|
||||||
|
('CLIENT_SERVICE_TYPE', '부가가치세', '부가가치세', 60),
|
||||||
|
('CLIENT_SERVICE_TYPE', '기타', '기타', 70),
|
||||||
|
|
||||||
|
('CLIENT_TAX_TYPE', '개인사업자', '개인사업자', 10),
|
||||||
|
('CLIENT_TAX_TYPE', '법인사업자', '법인사업자', 20),
|
||||||
|
('CLIENT_TAX_TYPE', '면세사업자', '면세사업자', 30),
|
||||||
|
('CLIENT_TAX_TYPE', '근로소득자', '근로소득자', 40),
|
||||||
|
('CLIENT_TAX_TYPE', '기타', '기타', 50),
|
||||||
|
|
||||||
|
('CLIENT_SOURCE', '홈페이지문의', '홈페이지 문의', 10),
|
||||||
|
('CLIENT_SOURCE', '소개', '소개', 20),
|
||||||
|
('CLIENT_SOURCE', '직접방문', '직접 방문', 30),
|
||||||
|
('CLIENT_SOURCE', '카카오채널', '카카오 채널', 40),
|
||||||
|
('CLIENT_SOURCE', '블로그', '블로그', 50),
|
||||||
|
('CLIENT_SOURCE', '기타', '기타', 60),
|
||||||
|
|
||||||
|
('CONTRACT_SERVICE_TYPE', '개인기장대리', '개인 기장대리', 10),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '법인기장대리', '법인 기장대리', 20),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '세무조정', '세무조정', 30),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '세무컨설팅', '세무컨설팅', 40),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '불복청구', '불복청구', 50),
|
||||||
|
|
||||||
|
('REVENUE_SERVICE_TYPE', '기장수수료', '기장 수수료', 10),
|
||||||
|
('REVENUE_SERVICE_TYPE', '세무조정료', '세무조정료', 20),
|
||||||
|
('REVENUE_SERVICE_TYPE', '세무상담료', '세무상담료', 30),
|
||||||
|
('REVENUE_SERVICE_TYPE', '신고대행료', '신고 대행료', 40),
|
||||||
|
('REVENUE_SERVICE_TYPE', '자문수수료', '자문 수수료', 50),
|
||||||
|
|
||||||
|
('FILING_TYPE', '종합소득세', '종합소득세', 10),
|
||||||
|
('FILING_TYPE', '부가가치세', '부가가치세', 20),
|
||||||
|
('FILING_TYPE', '법인세', '법인세', 30),
|
||||||
|
('FILING_TYPE', '원천세', '원천세', 40),
|
||||||
|
('FILING_TYPE', '양도소득세', '양도소득세', 50),
|
||||||
|
('FILING_TYPE', '상속증여세', '상속·증여세', 60),
|
||||||
|
('FILING_TYPE', '세무조정', '세무조정', 70),
|
||||||
|
|
||||||
|
('TAX_RISK_LEVEL', 'low', '낮음', 10),
|
||||||
|
('TAX_RISK_LEVEL', 'normal', '보통', 20),
|
||||||
|
('TAX_RISK_LEVEL', 'high', '높음', 30)
|
||||||
|
ON CONFLICT (code_group, code_value) DO UPDATE
|
||||||
|
SET code_name = EXCLUDED.code_name,
|
||||||
|
sort_order = EXCLUDED.sort_order,
|
||||||
|
is_active = TRUE;
|
||||||
|
|
||||||
|
-- Normalize storage keys and migrate existing rows.
|
||||||
|
UPDATE common_codes
|
||||||
|
SET code_value = CASE
|
||||||
|
WHEN code_group = 'CLIENT_SERVICE_TYPE' AND code_value = '증여·상속' THEN '증여상속'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '홈페이지 문의' THEN '홈페이지문의'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '직접 방문' THEN '직접방문'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '카카오 채널' THEN '카카오채널'
|
||||||
|
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '개인 기장대리' THEN '개인기장대리'
|
||||||
|
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '법인 기장대리' THEN '법인기장대리'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '기장 수수료' THEN '기장수수료'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '신고 대행료' THEN '신고대행료'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '자문 수수료' THEN '자문수수료'
|
||||||
|
WHEN code_group = 'FILING_TYPE' AND code_value = '상속·증여세' THEN '상속증여세'
|
||||||
|
ELSE code_value
|
||||||
|
END,
|
||||||
|
code_name = CASE
|
||||||
|
WHEN code_group = 'CLIENT_SERVICE_TYPE' AND code_value = '증여·상속' THEN '증여·상속'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '홈페이지 문의' THEN '홈페이지 문의'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '직접 방문' THEN '직접 방문'
|
||||||
|
WHEN code_group = 'CLIENT_SOURCE' AND code_value = '카카오 채널' THEN '카카오 채널'
|
||||||
|
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '개인 기장대리' THEN '개인 기장대리'
|
||||||
|
WHEN code_group = 'CONTRACT_SERVICE_TYPE' AND code_value = '법인 기장대리' THEN '법인 기장대리'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '기장 수수료' THEN '기장 수수료'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '신고 대행료' THEN '신고 대행료'
|
||||||
|
WHEN code_group = 'REVENUE_SERVICE_TYPE' AND code_value = '자문 수수료' THEN '자문 수수료'
|
||||||
|
WHEN code_group = 'FILING_TYPE' AND code_value = '상속·증여세' THEN '상속·증여세'
|
||||||
|
ELSE code_name
|
||||||
|
END
|
||||||
|
WHERE (code_group, code_value) IN (
|
||||||
|
('CLIENT_SERVICE_TYPE', '증여·상속'),
|
||||||
|
('CLIENT_SOURCE', '홈페이지 문의'),
|
||||||
|
('CLIENT_SOURCE', '직접 방문'),
|
||||||
|
('CLIENT_SOURCE', '카카오 채널'),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '개인 기장대리'),
|
||||||
|
('CONTRACT_SERVICE_TYPE', '법인 기장대리'),
|
||||||
|
('REVENUE_SERVICE_TYPE', '기장 수수료'),
|
||||||
|
('REVENUE_SERVICE_TYPE', '신고 대행료'),
|
||||||
|
('REVENUE_SERVICE_TYPE', '자문 수수료'),
|
||||||
|
('FILING_TYPE', '상속·증여세')
|
||||||
|
);
|
||||||
|
|
||||||
|
UPDATE clients
|
||||||
|
SET
|
||||||
|
service_type = CASE WHEN service_type = '증여·상속' THEN '증여상속' ELSE service_type END,
|
||||||
|
source = CASE
|
||||||
|
WHEN source = '홈페이지 문의' THEN '홈페이지문의'
|
||||||
|
WHEN source = '직접 방문' THEN '직접방문'
|
||||||
|
WHEN source = '카카오 채널' THEN '카카오채널'
|
||||||
|
ELSE source
|
||||||
|
END;
|
||||||
|
|
||||||
|
UPDATE contracts
|
||||||
|
SET service_type = REPLACE(REPLACE(service_type, ' ', ''), '·', '')
|
||||||
|
WHERE service_type IS NOT NULL;
|
||||||
|
|
||||||
|
UPDATE revenue_tracking
|
||||||
|
SET service_type = REPLACE(REPLACE(service_type, ' ', ''), '·', '')
|
||||||
|
WHERE service_type IS NOT NULL;
|
||||||
|
|
||||||
|
UPDATE tax_filings
|
||||||
|
SET filing_type = '상속증여세'
|
||||||
|
WHERE filing_type = '상속·증여세';
|
||||||
|
|
||||||
|
UPDATE tax_filing_schedules
|
||||||
|
SET filing_type = '상속증여세'
|
||||||
|
WHERE filing_type = '상속·증여세';
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- Allow Korean code values and future growth without truncation risk.
|
||||||
|
ALTER TABLE common_codes
|
||||||
|
ALTER COLUMN code_group TYPE VARCHAR(80),
|
||||||
|
ALTER COLUMN code_value TYPE VARCHAR(120),
|
||||||
|
ALTER COLUMN code_name TYPE VARCHAR(200);
|
||||||
|
|
||||||
|
ALTER TABLE clients
|
||||||
|
ALTER COLUMN service_type TYPE VARCHAR(100),
|
||||||
|
ALTER COLUMN tax_type TYPE VARCHAR(60),
|
||||||
|
ALTER COLUMN source TYPE VARCHAR(100);
|
||||||
|
|
||||||
|
ALTER TABLE contracts
|
||||||
|
ALTER COLUMN service_type TYPE VARCHAR(120);
|
||||||
|
|
||||||
|
ALTER TABLE revenue_tracking
|
||||||
|
ALTER COLUMN service_type TYPE VARCHAR(120);
|
||||||
|
|
||||||
|
ALTER TABLE tax_filings
|
||||||
|
ALTER COLUMN filing_type TYPE VARCHAR(120);
|
||||||
|
|
||||||
|
ALTER TABLE tax_filing_schedules
|
||||||
|
ALTER COLUMN filing_type TYPE VARCHAR(120);
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
-- Additional common codes for admin combo policy normalization.
|
||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order) VALUES
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '방문상담', '방문 상담', 10),
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '전화상담', '전화 상담', 20),
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '세무조사대응미팅', '세무조사 대응 미팅', 30),
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '카카오톡상담', '카카오톡 상담', 40),
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '이메일자료접수', '이메일 자료 접수', 50),
|
||||||
|
('CONSULTING_ACTIVITY_TYPE', '기타', '기타', 60),
|
||||||
|
|
||||||
|
('ANNOUNCEMENT_DISPLAY_TYPE', 'info', '일반', 10),
|
||||||
|
('ANNOUNCEMENT_DISPLAY_TYPE', 'banner', '배너', 20),
|
||||||
|
('ANNOUNCEMENT_DISPLAY_TYPE', 'urgent', '긴급', 30)
|
||||||
|
ON CONFLICT (code_group, code_value) DO UPDATE
|
||||||
|
SET code_name = EXCLUDED.code_name,
|
||||||
|
sort_order = EXCLUDED.sort_order,
|
||||||
|
is_active = TRUE;
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
ALTER TABLE blog_posts
|
||||||
|
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_blog_posts_deleted_at
|
||||||
|
ON blog_posts (deleted_at)
|
||||||
|
WHERE deleted_at IS NOT NULL;
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
INSERT INTO common_codes (code_group, code_value, code_name, sort_order)
|
||||||
|
SELECT v.code_group, v.code_value, v.code_name, v.sort_order
|
||||||
|
FROM (
|
||||||
|
VALUES
|
||||||
|
('FAQ_CATEGORY', '기장세금신고', '기장세금신고', 10),
|
||||||
|
('FAQ_CATEGORY', '부동산', '부동산', 20),
|
||||||
|
('FAQ_CATEGORY', '증여상속', '증여상속', 30),
|
||||||
|
('FAQ_CATEGORY', '기타', '기타', 40)
|
||||||
|
) AS v(code_group, code_value, code_name, sort_order)
|
||||||
|
WHERE NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM common_codes cc
|
||||||
|
WHERE cc.code_group = v.code_group
|
||||||
|
AND cc.code_value = v.code_value
|
||||||
|
);
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
import { chromium } from '@playwright/test';
|
|
||||||
|
|
||||||
const browser = await chromium.launch();
|
|
||||||
const page = await browser.newPage();
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 1. 로그인
|
|
||||||
console.log('🔓 로그인 중...');
|
|
||||||
await page.goto('http://178.104.200.7/taxbaik/admin/login', { waitUntil: 'networkidle' });
|
|
||||||
await page.fill('input[placeholder="사용자명"]', 'test_admin');
|
|
||||||
await page.fill('input[placeholder="비밀번호"]', 'TestAdmin@123456');
|
|
||||||
await page.click('button:has-text("로그인")');
|
|
||||||
await page.waitForURL(/\/taxbaik\/admin\/dashboard$/, { timeout: 10000 });
|
|
||||||
console.log('✅ 로그인 성공');
|
|
||||||
|
|
||||||
// 2. Settings 페이지로 이동
|
|
||||||
console.log('\n📍 Settings 페이지로 이동...');
|
|
||||||
await page.goto('http://178.104.200.7/taxbaik/admin/settings', { waitUntil: 'domcontentloaded' });
|
|
||||||
|
|
||||||
// 3. 다양한 대기 전략 시도
|
|
||||||
console.log('⏳ 페이지 로드 대기 중...');
|
|
||||||
|
|
||||||
for (let i = 1; i <= 5; i++) {
|
|
||||||
await page.waitForTimeout(1000);
|
|
||||||
const title = await page.locator('h4:has-text("설정")').count();
|
|
||||||
const body = await page.locator('body').evaluate(el => el.innerHTML.length);
|
|
||||||
const mudComponents = await page.locator('[class*="mud-"]').count();
|
|
||||||
|
|
||||||
console.log(`시도 ${i}: body=${body}bytes, mud=${mudComponents}, title=${title}`);
|
|
||||||
|
|
||||||
if (mudComponents > 10 && body > 5000) {
|
|
||||||
console.log('✅ 페이지 렌더링 감지됨!');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 최종 상태 확인
|
|
||||||
console.log('\n📊 최종 상태:');
|
|
||||||
const hasContent = await page.locator('body').evaluate(el => el.innerText.length > 100);
|
|
||||||
const hasComponents = await page.locator('[class*="mud-"]').count();
|
|
||||||
|
|
||||||
console.log(`- 텍스트 콘텐츠: ${hasContent ? '있음' : '없음'}`);
|
|
||||||
console.log(`- MudBlazor 컴포넌트: ${hasComponents}개`);
|
|
||||||
|
|
||||||
if (!hasContent) {
|
|
||||||
console.log('\n❌ Settings 페이지 렌더링 실패');
|
|
||||||
console.log('HTML 스니펫:');
|
|
||||||
const html = await page.content();
|
|
||||||
const bodyMatch = html.match(/<body[^>]*>([\s\S]{0,500})/);
|
|
||||||
if (bodyMatch) console.log(bodyMatch[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ 에러:', error.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
await browser.close();
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
DEPLOY_HOME="/home/kjh2064"
|
|
||||||
WEB_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
||||||
|
|
||||||
echo "===== 🚀 TaxBaik 배포 스크립트 ====="
|
|
||||||
echo "Web Timestamp: $WEB_TIMESTAMP"
|
|
||||||
|
|
||||||
# Web 배포
|
|
||||||
echo "=== Deploying Web ==="
|
|
||||||
WEB_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_${WEB_TIMESTAMP}"
|
|
||||||
mkdir -p "$WEB_DEPLOY_DIR"
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Error: Publish directory required"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 첫 번째 인자는 publish 경로
|
|
||||||
cp -r "$1/web" "$WEB_DEPLOY_DIR/"
|
|
||||||
ln -sfn "$WEB_DEPLOY_DIR/web" "$DEPLOY_HOME/taxbaik_active"
|
|
||||||
echo "✓ Web symlink updated: $WEB_DEPLOY_DIR/web"
|
|
||||||
|
|
||||||
# 프로세스 재시작
|
|
||||||
echo "=== Restarting processes ==="
|
|
||||||
pkill -9 -f "TaxBaik.Web" || true
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
echo "=== Starting Web ==="
|
|
||||||
cd "$DEPLOY_HOME/taxbaik_active"
|
|
||||||
export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
|
||||||
export ASPNETCORE_ENVIRONMENT=Production
|
|
||||||
export ASPNETCORE_URLS=http://127.0.0.1:5001
|
|
||||||
nohup /usr/local/dotnet/dotnet TaxBaik.Web.dll > web.log 2>&1 &
|
|
||||||
sleep 2
|
|
||||||
ps aux | grep TaxBaik.Web | grep -v grep && echo "✓ Web started" || echo "✗ Web failed"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "===== ✅ 배포 완료 ====="
|
|
||||||
cat "$DEPLOY_HOME/taxbaik_active/wwwroot/version.txt" 2>/dev/null || echo "Version file not found"
|
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
# 1. TaxBaik 홈페이지 (taxbaik.com, www.taxbaik.com)
|
||||||
|
server {
|
||||||
|
server_name taxbaik.com www.taxbaik.com;
|
||||||
|
client_max_body_size 512M;
|
||||||
|
|
||||||
|
|
||||||
|
# /admin 하위 요청을 /taxbaik/admin 으로 리다이렉트하여 Blazor Base Path 대응
|
||||||
|
location /admin {
|
||||||
|
return 301 $scheme://$host/taxbaik$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 루트 경로 요청을 /taxbaik 으로 프록싱하여 base href /taxbaik/ 에 대응
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:5001/taxbaik/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# /taxbaik/ 하위로 들어오는 리소스 및 페이지 요청 처리
|
||||||
|
location /taxbaik {
|
||||||
|
proxy_pass http://127.0.0.1:5001;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_read_timeout 120s;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2. Gitea (gitea.taxbaik.com)
|
||||||
|
server {
|
||||||
|
server_name gitea.taxbaik.com;
|
||||||
|
client_max_body_size 512M;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:3000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_read_timeout 300;
|
||||||
|
proxy_connect_timeout 300;
|
||||||
|
proxy_send_timeout 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3. QuantEngine (quant.taxbaik.com)
|
||||||
|
server {
|
||||||
|
server_name quant.taxbaik.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:5000/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
if ($host = www.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
if ($host = taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name taxbaik.com www.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
if ($host = gitea.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name gitea.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
if ($host = quant.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name quant.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=TaxBaik Local TCP Proxy (5001 -> active blue/green port)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=kjh2064
|
||||||
|
WorkingDirectory=/home/kjh2064/taxbaik_active
|
||||||
|
ExecStart=/usr/bin/dotnet TaxBaik.Proxy.dll
|
||||||
|
Restart=always
|
||||||
|
RestartSec=3
|
||||||
|
|
||||||
|
# Proxy는 백엔드 포트(5003/5004) 전환 중에도 살아 있어야 한다.
|
||||||
|
TimeoutStopSec=15
|
||||||
|
KillMode=mixed
|
||||||
|
KillSignal=SIGTERM
|
||||||
|
|
||||||
|
SyslogIdentifier=taxbaik-proxy
|
||||||
|
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=TaxBaik Website and Admin (.NET 10)
|
Description=TaxBaik Backend App (.NET 10)
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
@@ -17,7 +17,7 @@ KillSignal=SIGTERM
|
|||||||
|
|
||||||
SyslogIdentifier=taxbaik
|
SyslogIdentifier=taxbaik
|
||||||
Environment=ASPNETCORE_ENVIRONMENT=Production
|
Environment=ASPNETCORE_ENVIRONMENT=Production
|
||||||
Environment=ASPNETCORE_URLS=http://127.0.0.1:5001
|
Environment=ASPNETCORE_URLS=http://127.0.0.1:5004
|
||||||
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
||||||
# 아래 줄은 서버에서 직접 편집 (git에 커밋하지 않음)
|
# 아래 줄은 서버에서 직접 편집 (git에 커밋하지 않음)
|
||||||
# Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=CHANGE_ME
|
# Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=CHANGE_ME
|
||||||
|
|||||||
+135
@@ -0,0 +1,135 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DEPLOY_HOME="/home/kjh2064"
|
||||||
|
PORT_FILE="$DEPLOY_HOME/taxbaik_port"
|
||||||
|
TIMESTAMP=$(TZ=Asia/Seoul date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
echo "===== 🚀 TaxBaik Green/Blue Deployment Script ====="
|
||||||
|
|
||||||
|
if [ "${TAXBAIK_DEPLOY_FROM_CI:-}" != "1" ]; then
|
||||||
|
echo "❌ This deployment script may only be run from CI." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 1. Determine active port
|
||||||
|
ACTIVE_PORT=5003
|
||||||
|
if [ -f "$PORT_FILE" ]; then
|
||||||
|
ACTIVE_PORT=$(cat "$PORT_FILE" | tr -d '[:space:]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Determine target port
|
||||||
|
TARGET_PORT=5003
|
||||||
|
if [ "$ACTIVE_PORT" -eq 5003 ]; then
|
||||||
|
TARGET_PORT=5004
|
||||||
|
else
|
||||||
|
TARGET_PORT=5003
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Active Port: $ACTIVE_PORT"
|
||||||
|
echo "Target Port: $TARGET_PORT"
|
||||||
|
|
||||||
|
# 3. New deploy dir is passed as first argument
|
||||||
|
DEPLOY_DIR="$1"
|
||||||
|
if [ -z "$DEPLOY_DIR" ]; then
|
||||||
|
echo "Error: Deployment directory argument required"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Deploy Directory: $DEPLOY_DIR"
|
||||||
|
|
||||||
|
if [ ! -s "$DEPLOY_DIR/appsettings.Production.json" ]; then
|
||||||
|
echo "❌ Missing production settings: $DEPLOY_DIR/appsettings.Production.json" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -s "$DEPLOY_DIR/proxy/TaxBaik.Proxy.dll" ]; then
|
||||||
|
echo "❌ Missing proxy artifact: $DEPLOY_DIR/proxy/TaxBaik.Proxy.dll" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 0. Ensure the local TCP proxy exists and is running.
|
||||||
|
# Nginx and external traffic always enter through 127.0.0.1:5001.
|
||||||
|
if ! ss -tln | grep -q ':5001 '; then
|
||||||
|
echo "=== Starting proxy on 127.0.0.1:5001 ==="
|
||||||
|
cd "$DEPLOY_DIR/proxy"
|
||||||
|
nohup /usr/bin/dotnet TaxBaik.Proxy.dll > "$DEPLOY_HOME/taxbaik_proxy.log" 2>&1 &
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! ss -tln | grep -q ':5001 '; then
|
||||||
|
echo "❌ Proxy on 127.0.0.1:5001 is not running. Abort deploy." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3.5 Fix Blazor WASM runtime filename mismatch
|
||||||
|
# ASP.NET Core 10 uses blazor.webassembly.js but pages reference blazor.web.js
|
||||||
|
echo "=== Fixing Blazor WASM Runtime Filename ==="
|
||||||
|
if [ -f "$DEPLOY_DIR/wwwroot/_framework/blazor.webassembly.js" ] && [ ! -f "$DEPLOY_DIR/wwwroot/_framework/blazor.web.js" ]; then
|
||||||
|
ln -s blazor.webassembly.js "$DEPLOY_DIR/wwwroot/_framework/blazor.web.js"
|
||||||
|
echo "✓ Created symlink: blazor.web.js -> blazor.webassembly.js"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Start the new app on the target port
|
||||||
|
echo "=== Starting New App on Port $TARGET_PORT ==="
|
||||||
|
cd "$DEPLOY_DIR"
|
||||||
|
export ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
export ASPNETCORE_URLS="http://127.0.0.1:$TARGET_PORT"
|
||||||
|
export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||||
|
export DOTNET_PRINT_TELEMETRY_MESSAGE=false
|
||||||
|
|
||||||
|
# Run dotnet process
|
||||||
|
nohup /usr/bin/dotnet TaxBaik.Web.dll > "web_${TARGET_PORT}.log" 2>&1 &
|
||||||
|
NEW_PID=$!
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Verify process is running
|
||||||
|
if ! ps -p $NEW_PID > /dev/null; then
|
||||||
|
echo "❌ Failed to start dotnet process on port $TARGET_PORT"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Health Check Loop
|
||||||
|
echo "=== Health Checking Port $TARGET_PORT ==="
|
||||||
|
ATTEMPTS=20
|
||||||
|
SUCCESS=false
|
||||||
|
for i in $(seq 1 $ATTEMPTS); do
|
||||||
|
STATUS=$(curl -sf -o /dev/null -w '%{http_code}' "http://127.0.0.1:${TARGET_PORT}/taxbaik/healthz" 2>/dev/null || echo "000")
|
||||||
|
if [ "$STATUS" = "200" ]; then
|
||||||
|
echo "✓ Health check passed on port $TARGET_PORT (Attempt $i/$ATTEMPTS)"
|
||||||
|
SUCCESS=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo " Waiting for health check... ($i/$ATTEMPTS, Status: $STATUS)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$SUCCESS" = "false" ]; then
|
||||||
|
echo "❌ Health check failed. Rolling back..."
|
||||||
|
kill -9 $NEW_PID || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. Switch Traffic
|
||||||
|
echo "=== Switching Traffic to Port $TARGET_PORT ==="
|
||||||
|
echo "$TARGET_PORT" > "$PORT_FILE"
|
||||||
|
echo "✓ Traffic routed to $TARGET_PORT"
|
||||||
|
|
||||||
|
# 7. Terminate Old App
|
||||||
|
echo "=== Stopping Old App on Port $ACTIVE_PORT ==="
|
||||||
|
# Find PID listening on ACTIVE_PORT
|
||||||
|
OLD_PID=$(ss -tlnp | grep ":$ACTIVE_PORT " | grep -oP 'pid=\K\d+' | head -n1)
|
||||||
|
if [ -n "$OLD_PID" ]; then
|
||||||
|
echo "Killing old process PID: $OLD_PID"
|
||||||
|
kill -15 $OLD_PID || kill -9 $OLD_PID
|
||||||
|
echo "✓ Old process terminated"
|
||||||
|
else
|
||||||
|
echo "No old process found on port $ACTIVE_PORT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8. Cleanup old deployment directories (Keep last 5)
|
||||||
|
echo "=== Cleaning Up Old Deployments ==="
|
||||||
|
ls -1dt $DEPLOY_HOME/deployments/taxbaik_* 2>/dev/null | tail -n +6 | xargs rm -rf 2>/dev/null || true
|
||||||
|
echo "✓ Cleanup completed"
|
||||||
|
|
||||||
|
echo "===== ✅ Green/Blue Deployment Completed Successfully ====="
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:18-alpine
|
|
||||||
container_name: taxbaik-db
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: taxbaikdb
|
|
||||||
POSTGRES_USER: taxbaik
|
|
||||||
POSTGRES_PASSWORD: taxbaik123
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
volumes:
|
|
||||||
- postgres_data:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U taxbaik -d taxbaikdb"]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
|
|
||||||
taxbaik-web:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.web
|
|
||||||
container_name: taxbaik-web
|
|
||||||
environment:
|
|
||||||
ASPNETCORE_ENVIRONMENT: Development
|
|
||||||
ASPNETCORE_URLS: http://0.0.0.0:5001
|
|
||||||
ConnectionStrings__Default: "Host=postgres;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
|
||||||
Jwt__SecretKey: "dev-secret-key-change-in-production-min-32-chars!"
|
|
||||||
ports:
|
|
||||||
- "5001:5001"
|
|
||||||
depends_on:
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
volumes:
|
|
||||||
- ./publish:/app
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
postgres_data:
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# Admin Pattern Critique And WBS
|
||||||
|
|
||||||
|
대상은 어드민 Blog, 문의사항, 등록/수정 페이지 전반이다. 이 문서는 비판, 개선 방향, 정량 완료 기준을 한 곳에 둔다.
|
||||||
|
|
||||||
|
## Brutal Critique
|
||||||
|
|
||||||
|
| 영역 | 현재 문제 | 왜 위험한가 | 개선 기준 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| API-first 위반 | 어드민 Razor 컴포넌트가 `BlogService`, `InquiryService`, repository를 직접 주입 | 어드민을 클라이언트 사이드 Blazor WebAssembly로 운용할 때 구조가 깨지고 API 계약 테스트가 우회된다 | 모든 어드민 화면은 BrowserClient를 통해 `/api/*` 호출 |
|
||||||
|
| Blog 등록/수정 중복 | `BlogCreate.razor`와 `BlogEdit.razor`가 필드, JS 편집기, 저장 로직을 반복 | 한쪽만 수정되는 파편화가 생긴다 | `BlogForm.razor` + `BlogEditorJsModule` 패턴 |
|
||||||
|
| JS 과다/전역 상태 | `window.easyMDEInstance` 단일 전역 인스턴스 사용 | 페이지 이동/다중 편집/재렌더에서 내용 섞임 위험, Blazor 책임 경계가 흐려진다 | JS 제거 우선 검토, 불가피하면 JS module + element별 instance map + dispose |
|
||||||
|
| 문의 수정 착시 | `InquiryEdit`가 이름/전화/이메일/내용 수정 UI를 보여주지만 실제 저장은 상태/메모 중심 | 운영자가 저장 성공을 믿어도 핵심 데이터가 DB에 반영되지 않을 수 있다 | 전체 수정 API를 만들거나 해당 필드를 read-only 처리 |
|
||||||
|
| 문자열 상태 난립 | 문의 상태, 서비스 유형이 UI 문자열/API 문자열/DB 값으로 분산 | 오타 하나가 통계와 필터를 깨뜨린다 | enum/공통코드/상태 mapper 단일화 |
|
||||||
|
| 삭제 위험 | Blog/Inquiry 삭제가 즉시 hard delete | 운영 감사, 상담 이력, SEO URL 보존에 취약 | soft delete 또는 archive 정책 |
|
||||||
|
| 정합성 부족 | Blog slug 생성이 전체 목록 조회 기반 | 동시 생성 충돌에 약하고 데이터가 늘면 느려진다 | DB unique index + 충돌 재시도 |
|
||||||
|
| 템플릿 부재 | CRUD 페이지마다 버튼, 오류, 로딩, 페이징 패턴이 다름 | 바이브코딩식 흔들림이 반복된다 | List/Form/Detail/PageState 템플릿화 |
|
||||||
|
| 배포 완료 착시 | 문서상 완료 항목과 운영 검증 항목이 섞임 | 체크박스가 실제 성공을 대체한다 | WBS는 수치, 로그, CI URL로만 완료 |
|
||||||
|
|
||||||
|
## Target Admin Pattern
|
||||||
|
|
||||||
|
```text
|
||||||
|
Razor Page/Form
|
||||||
|
-> BrowserClient with JWT
|
||||||
|
-> Controller DTO
|
||||||
|
-> Application Service
|
||||||
|
-> Repository
|
||||||
|
-> DB constraints/indexes
|
||||||
|
```
|
||||||
|
|
||||||
|
어드민은 클라이언트 사이드 Blazor WebAssembly 기준이다. 예외는 명시해야 한다. 서버 전용 컴포넌트가 Application Service를 직접 호출해야 한다면 `ENGINEERING_HARNESS.md`의 API-first 기준에 대한 사유와 제거 예정 WBS를 남긴다.
|
||||||
|
|
||||||
|
## Quantitative Success Metrics
|
||||||
|
|
||||||
|
| 지표 | 기준값 | 측정 방법 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Admin direct service injection | 0건 | `rg "@inject .*Service|@inject I.*Repository" src/TaxBaik.Web.Client/Components/Admin` |
|
||||||
|
| Blog create/edit duplicate fields | 0개 중복 폼 | `BlogForm.razor` 단일 사용 여부 |
|
||||||
|
| Admin JavaScript surface | 필수 module만 허용 | `window.*` 전역 admin JS 0건, JS interop 사유 문서화 |
|
||||||
|
| Inquiry visible-but-unsaved fields | 0개 | E2E로 수정 후 API 재조회 |
|
||||||
|
| Protected admin API anonymous access | 0개 | API smoke에서 401/403 확인 |
|
||||||
|
| CI required gates | 6/6 통과 | build, unit, publish, deploy, browser e2e, api smoke |
|
||||||
|
| Playwright admin flows | 8개 이상 통과 | login, blog CRUD, inquiry CRUD/status, responsive, password, smoke |
|
||||||
|
| DB integrity constraints | 핵심 테이블 100% | PK, FK, unique/check/index 리뷰 |
|
||||||
|
| WBS evidence coverage | 100% | 각 완료 항목에 command/log/test 파일 기재 |
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
| Phase | 목적 | 종료 조건 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| P0 Harness | 기준 고정과 문서 최소화 | 이 문서와 Engineering Harness가 README에서 참조됨 |
|
||||||
|
| P1 Stabilize | Blog/Inquiry 착시와 중복 제거 | API-first 전환, 공통 폼, 정합성 테스트 통과 |
|
||||||
|
| P2 Harden | DB 제약, 충돌 방지, 삭제 정책 | migration + 회귀 테스트 + E2E 통과 |
|
||||||
|
| P3 Standardize | CRUD 템플릿화와 반복 패턴 제거 | 신규 CRUD 생성 시 템플릿만 사용 |
|
||||||
|
| P4 Integrate | 더존 UX 정신 내재화 | 고밀도 화면, 표준 동선, 빠른 입력, 상태 가시성, 회귀 최소화 검증 |
|
||||||
|
| P5 Operate | CI/CD와 운영 지표 고도화 | 배포본 기준 smoke/E2E/로그 알림 안정화 |
|
||||||
|
|
||||||
|
## Detailed WBS
|
||||||
|
|
||||||
|
| ID | 작업 | 산출물 | 정량 완료 기준 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| P0-01 | 문서 기준점 정리 | `docs/INDEX.md`, `ENGINEERING_HARNESS.md` | canonical 문서 3개 이하, README 링크 1곳 |
|
||||||
|
| P0-02 | 기존 장문 문서 역할 축소 | README 문서 섹션 정리 | `CLAUDE.md`를 보조자료로 표시 |
|
||||||
|
| P1-01 | Blog API client 도입 | `IBlogBrowserClient`, `BlogBrowserClient` | Blog admin page direct service/repository injection 0건 |
|
||||||
|
| P1-02 | Blog 공통 폼 도입 | `BlogForm.razor` | create/edit 필드 중복 0건, 저장 E2E 2개 통과 |
|
||||||
|
| P1-03 | Markdown editor JS 최소화/격리 | Blazor 대체 또는 JS module | 전역 `window.easyMDEInstance` 사용 0건, JS interop 사유 명시 |
|
||||||
|
| P1-04 | Inquiry 수정 계약 확정 | `UpdateInquiryRequest` 또는 read-only UI | 화면 표시 editable 필드와 저장 필드 불일치 0건 |
|
||||||
|
| P1-05 | Inquiry API client 도입 | `IInquiryBrowserClient` 정비 | Inquiry admin direct service injection 0건 |
|
||||||
|
| P1-06 | 상태/서비스 유형 단일화 | enum/common code/mapper | 상태 문자열 하드코딩 UI 위치 0건 또는 공통 상수 참조 |
|
||||||
|
| P2-01 | Blog slug 충돌 방지 | unique index + retry | 동시 생성 테스트 1개 통과 |
|
||||||
|
| P2-02 | 삭제 정책 정리 | soft delete migration 또는 archive 정책 | hard delete 운영 엔티티 0건 또는 예외 문서화 |
|
||||||
|
| P2-03 | DB index 점검 | migration | 목록/검색/상태 필터 explain 기준 seq scan 위험 제거 |
|
||||||
|
| P2-04 | 낙관적 충돌 방지 | `updatedAt` 조건부 update | stale update API 테스트 1개 이상 통과 |
|
||||||
|
| P3-01 | CRUD 템플릿 작성 | page/form/client/test skeleton | 신규 admin CRUD 생성 시간 30% 감소 |
|
||||||
|
| P3-02 | 공통 PageState/Error 처리 | reusable component/service | admin page 중복 try/catch/snackbar 패턴 50% 감소 |
|
||||||
|
| P3-03 | 메뉴/라우팅 표준화 | route registry 또는 constants | admin route 문자열 중복 50% 감소 |
|
||||||
|
| P4-01 | 더존 UX 패턴 캡슐화 | 고밀도 grid/form/template 규칙 | 신규 어드민 화면이 템플릿을 따르지 않는 경우 0건 |
|
||||||
|
| P4-02 | UX 회귀 검증 | responsive, keyboard flow, density, state visibility test | 핵심 CRUD 화면 E2E 100% 통과 |
|
||||||
|
| P5-01 | CI gate 명문화 | workflow 체크 목록 | 6개 gate 모두 required |
|
||||||
|
| P5-02 | 배포본 API smoke 확장 | workflow curl 추가 | Blog/Inquiry create-read-update test 2xx |
|
||||||
|
| P5-03 | 운영 회귀 대시보드 | test report/version endpoint | 배포 커밋과 E2E 결과 추적 가능 |
|
||||||
|
| P4-03 | 기존 20개+ 어드민 화면을 SmartAdmin 5.5 참조(`legacy/smartadmin/`, `DOUZONE_UX_GUIDE.md`)로 재단장 (2026-07-03 시점 미착수, 향후 별도 진행) | 각 화면의 색상/카드/타이포그래피 갱신 | SmartAdmin 매핑 표 기준 적용 화면 수 / 전체 화면 수 100% |
|
||||||
|
|
||||||
|
## Immediate Refactor Order
|
||||||
|
|
||||||
|
1. `InquiryEdit` 착시 제거: 전체 수정 API를 추가하거나 저장 안 되는 필드를 read-only로 바꾼다.
|
||||||
|
2. `BlogForm.razor`를 만들고 create/edit 중복을 제거한다.
|
||||||
|
3. Blog/Inquiry 어드민 페이지를 BrowserClient 경유로 바꾼다.
|
||||||
|
4. 상태/서비스 유형 문자열을 단일 source로 모은다.
|
||||||
|
5. DB 제약과 삭제 정책을 migration으로 고정한다.
|
||||||
|
|
||||||
|
## Completion Rule
|
||||||
|
|
||||||
|
WBS 항목은 다음 네 가지가 모두 있어야 완료다.
|
||||||
|
|
||||||
|
- 관련 코드 또는 문서 diff
|
||||||
|
- 로컬 검증 명령과 결과
|
||||||
|
- CI/CD workflow 성공
|
||||||
|
- 배포본 기준 API 또는 Browser E2E 증거
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# Combo Policy
|
||||||
|
|
||||||
|
이 문서는 TaxBaik 어드민의 콤보 정책을 정한다. 여기서 콤보는 `MudSelect`, `MudAutocomplete`, `MudChip`, 상태 필터, 코드 선택 입력을 포함한다.
|
||||||
|
|
||||||
|
## Policy
|
||||||
|
|
||||||
|
- 닫힌 집합은 `MudSelect`를 쓴다.
|
||||||
|
- 열린 집합 또는 검색이 필요한 집합은 `MudAutocomplete`를 쓴다.
|
||||||
|
- 상태/유형/등급처럼 값이 고정된 항목은 문자열 직접 입력을 금지한다.
|
||||||
|
- 선택한 값은 저장 값과 표시 값을 분리한다.
|
||||||
|
- 표시 값은 사람이 읽는 라벨, 저장 값은 코드값이어야 한다.
|
||||||
|
- `null` 허용 여부는 UI에서 명시한다.
|
||||||
|
- `전체`, `선택 안 함`, `기타`는 서로 다른 의미로 취급한다.
|
||||||
|
- 다중 선택이 필요하면 단일 선택 콤보를 억지로 재사용하지 않는다.
|
||||||
|
|
||||||
|
## Closed Set
|
||||||
|
|
||||||
|
다음 경우 `MudSelect`를 기본으로 사용한다.
|
||||||
|
|
||||||
|
- 상태
|
||||||
|
- 세금 유형
|
||||||
|
- 신고 유형
|
||||||
|
- 위험도
|
||||||
|
- 고정 서비스 유형
|
||||||
|
- 공지 유형
|
||||||
|
|
||||||
|
규칙:
|
||||||
|
|
||||||
|
- 값은 상수, enum, 공통코드 중 하나에서만 가져온다.
|
||||||
|
- `MudSelectItem`의 라벨과 값은 일치하는 쌍으로 관리한다.
|
||||||
|
- 운영자가 값의 의미를 추측해야 하는 항목은 콤보로 두지 않는다.
|
||||||
|
|
||||||
|
## Search Set
|
||||||
|
|
||||||
|
다음 경우 `MudAutocomplete`를 기본으로 사용한다.
|
||||||
|
|
||||||
|
- 고객 선택
|
||||||
|
- 회사 선택
|
||||||
|
- 데이터가 많아 스크롤 선택이 비효율적인 경우
|
||||||
|
|
||||||
|
규칙:
|
||||||
|
|
||||||
|
- 검색어 입력 후 서버 또는 클라이언트 필터 결과를 보여준다.
|
||||||
|
- 결과가 적을 때는 `MudSelect`보다 `MudAutocomplete`를 우선하지 않는다.
|
||||||
|
- 선택 후 보여주는 텍스트와 저장되는 id를 분리한다.
|
||||||
|
|
||||||
|
## Display Rules
|
||||||
|
|
||||||
|
- 목록에서는 상태를 칩으로 보여준다.
|
||||||
|
- 폼에서는 텍스트보다 구조화된 값으로 저장한다.
|
||||||
|
- 필터에서는 현재 선택값이 명확히 보이게 한다.
|
||||||
|
- `Clearable`은 의미가 명확한 경우에만 켠다.
|
||||||
|
|
||||||
|
## Standard Sources
|
||||||
|
|
||||||
|
- 상태 값은 `InquiryStatusMapper` 또는 전용 enum을 사용한다.
|
||||||
|
- 공지/신고/세무 정보는 각 도메인별 공통코드 소스를 둔다.
|
||||||
|
- 고객/회사 선택은 검색형 콤보로 통일한다.
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
- 같은 화면에 `MudSelect`와 자유 텍스트 입력을 섞어 같은 의미를 표현
|
||||||
|
- 코드값과 표시값을 뒤섞어서 저장
|
||||||
|
- 콤보 옵션을 화면마다 하드코딩
|
||||||
|
- `기타`를 예외 처리처럼 쓰고 실제 저장 값은 제각각 두는 것
|
||||||
|
- `전체`를 저장 값으로 사용
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
- 신규 어드민 화면은 이 문서의 `Closed Set`/`Search Set` 중 하나를 명시해야 한다.
|
||||||
|
- 상태/유형/등급 입력이 있는 화면은 콤보 정책 위반이 없어야 한다.
|
||||||
|
- 고객/회사처럼 데이터가 많은 항목은 검색형 선택으로 통일한다.
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Common Code Policy
|
||||||
|
|
||||||
|
이 문서는 어드민 콤보, 상태, 유형, 출처 값의 단일 기준이다. 값은 DB `common_codes`를 우선 사용하고, 화면은 표시명만 바꾼다.
|
||||||
|
|
||||||
|
## Canonical Rules
|
||||||
|
|
||||||
|
- `code_value`는 저장 키다.
|
||||||
|
- `code_name`은 화면 표시값이다.
|
||||||
|
- `code_value`는 공백을 넣지 않는다.
|
||||||
|
- `code_group`도 공백 없이 대문자/숫자/언더스코어 중심의 안정된 키를 쓴다.
|
||||||
|
- 새 콤보를 추가할 때는 먼저 `common_codes`에 그룹을 추가한다.
|
||||||
|
- 화면 하드코딩 배열은 금지한다. 불가피하면 임시 폴백으로만 두고 제거 계획을 함께 적는다.
|
||||||
|
- 같은 의미의 값이 테이블마다 다르면 저장값을 먼저 통일하고 마이그레이션으로 이관한다.
|
||||||
|
|
||||||
|
## Grouping Rules
|
||||||
|
|
||||||
|
- 상태값: `*_STATUS`
|
||||||
|
- 유형값: `*_TYPE`
|
||||||
|
- 출처값: `*_SOURCE`
|
||||||
|
- 위험도/스코어: `*_LEVEL`
|
||||||
|
|
||||||
|
## Standard Groups
|
||||||
|
|
||||||
|
- `INQUIRY_SERVICE_TYPE`
|
||||||
|
- `INQUIRY_STATUS`
|
||||||
|
- `CONSULTING_ACTIVITY_TYPE`
|
||||||
|
- `ANNOUNCEMENT_DISPLAY_TYPE`
|
||||||
|
- `CLIENT_STATUS`
|
||||||
|
- `CLIENT_SERVICE_TYPE`
|
||||||
|
- `CLIENT_TAX_TYPE`
|
||||||
|
- `CLIENT_SOURCE`
|
||||||
|
- `CONTRACT_SERVICE_TYPE`
|
||||||
|
- `REVENUE_SERVICE_TYPE`
|
||||||
|
- `FILING_TYPE`
|
||||||
|
- `TAX_RISK_LEVEL`
|
||||||
|
- `BUSINESS_TYPE`
|
||||||
|
- `FAQ_CATEGORY`
|
||||||
|
|
||||||
|
## Data Rules
|
||||||
|
|
||||||
|
- DB seed와 운영 데이터의 저장값이 다르면 UI를 먼저 맞추지 말고 저장값을 먼저 정규화한다.
|
||||||
|
- 한글 코드값을 사용하더라도 컬럼 길이를 먼저 검토하고, 업무 테이블과 마스터 테이블을 함께 조정한다.
|
||||||
|
- 한글 `code_value`가 필요하면 DB 컬럼 길이와 인덱스 길이를 먼저 확인하고, 초과 가능성이 있으면 표시값과 저장값을 분리한다.
|
||||||
|
- 표시용 문구가 길면 `code_name`에 둔다.
|
||||||
|
|
||||||
|
## UI Rules
|
||||||
|
|
||||||
|
- `MudSelect`는 `code_value`를 바인딩하고 `code_name`을 보여준다.
|
||||||
|
- 검색형이면 `MudAutocomplete`를 쓰고, 선택형이면 `MudSelect`를 쓴다.
|
||||||
|
- 자유 입력을 허용하지 않을 값은 텍스트 필드로 만들지 않는다.
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
- 신규 콤보 추가 시 DB 마이그레이션이 먼저 존재해야 한다.
|
||||||
|
- 화면에 하드코딩된 선택값이 없어야 한다.
|
||||||
|
- 기존 저장값과 신규 저장값의 불일치가 없어야 한다.
|
||||||
|
|
||||||
|
## Audit
|
||||||
|
|
||||||
|
- 점검 SQL은 [docs/ops/COMMON_CODE_AUDIT.sql](./ops/COMMON_CODE_AUDIT.sql)를 사용한다.
|
||||||
|
- 그룹 공백, 값 공백, 길이 초과, 테이블 매핑 불일치는 이 SQL에서 먼저 잡는다.
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
# DOUZONE UX Guide
|
||||||
|
|
||||||
|
이 문서는 TaxBaik 어드민 UX의 기준선이다. 목표는 더존 세무회계프로그램류의 고밀도 운영 화면을 구현하되, TaxBaik의 도메인과 검증 규칙을 유지하는 것이다.
|
||||||
|
|
||||||
|
## UX Principles
|
||||||
|
|
||||||
|
- 고밀도 우선: 한 화면에서 상태, 입력, 결과, 작업을 함께 본다.
|
||||||
|
- 표준 동선 우선: 목록 -> 상세 -> 수정 -> 저장 흐름을 기본으로 둔다.
|
||||||
|
- 빠른 입력 우선: 마우스 최소, 키보드/단축 동선 최대, 기본값 명확화.
|
||||||
|
- 상태 가시성 우선: 진행중/성공/실패/비활성/삭제됨을 즉시 구분 가능하게 한다.
|
||||||
|
- 회귀 최소화 우선: 같은 화면 패턴은 같은 컴포넌트와 같은 구조를 사용한다.
|
||||||
|
- 추측 금지: 의미가 불명확한 텍스트, 상태, 버튼, 색상은 새로 만들지 않는다.
|
||||||
|
|
||||||
|
## Layout Template
|
||||||
|
|
||||||
|
어드민 화면은 기본적으로 아래 구조를 따른다.
|
||||||
|
|
||||||
|
```text
|
||||||
|
PageHeader
|
||||||
|
FilterBar or ActionBar
|
||||||
|
ContentSurface
|
||||||
|
-> DenseGrid or DetailPanel
|
||||||
|
-> EmptyState when empty
|
||||||
|
-> Paging/Footer when needed
|
||||||
|
```
|
||||||
|
|
||||||
|
권장 규칙:
|
||||||
|
|
||||||
|
- 페이지 제목은 1개만 둔다.
|
||||||
|
- 보조 설명은 1줄만 둔다.
|
||||||
|
- 주요 액션은 우측 상단 또는 헤더 우측에 둔다.
|
||||||
|
- 목록은 `Dense`를 기본으로 한다.
|
||||||
|
- 상세/수정은 좌우 2열 또는 상단 요약 + 하단 폼 패턴을 우선한다.
|
||||||
|
|
||||||
|
## Component Template
|
||||||
|
|
||||||
|
### Page Header
|
||||||
|
|
||||||
|
- 구성: `Eyebrow`, `Title`, `Subtitle`, `Primary Action`
|
||||||
|
- 역할: 화면 맥락 고정, 다음 행동 제시
|
||||||
|
- 금지: 동일 화면에 헤더가 2개 이상 존재
|
||||||
|
|
||||||
|
### Dense Grid
|
||||||
|
|
||||||
|
- 행 간격은 좁게 유지한다.
|
||||||
|
- 컬럼은 우선순위 순으로 배치한다.
|
||||||
|
- 상태는 텍스트 대신 칩/색상/아이콘으로 함께 보여준다.
|
||||||
|
- 작업 버튼은 `보기`, `수정`, `삭제`처럼 짧고 일관되게 둔다.
|
||||||
|
|
||||||
|
### Form
|
||||||
|
|
||||||
|
- 기본값은 채워진 상태로 시작한다.
|
||||||
|
- 저장 전 필수 검증은 화면에서 즉시 보인다.
|
||||||
|
- 저장되지 않는 필드는 read-only로 바꾼다.
|
||||||
|
- 입력이 많은 폼은 섹션으로 나누되, 섹션 수는 최소화한다.
|
||||||
|
|
||||||
|
### Empty State
|
||||||
|
|
||||||
|
- 데이터 없음, 필터 결과 없음, 로드 실패를 구분한다.
|
||||||
|
- 단순 문구보다 다음 행동 버튼을 함께 둔다.
|
||||||
|
|
||||||
|
### Status Chip
|
||||||
|
|
||||||
|
- 상태는 문자열 그대로 노출하지 말고 칩으로 시각화한다.
|
||||||
|
- 색상은 의미를 유지한다.
|
||||||
|
- 동일 상태는 동일 색을 사용한다.
|
||||||
|
|
||||||
|
## SmartAdmin 5.5 Design Reference (2026-07-03, 신규 화면부터 적용)
|
||||||
|
|
||||||
|
이 섹션은 어드민의 **시각적 스킨**(색상, 카드 크롬, 로그인 화면 스타일, 셸 레이아웃) 기준이다. 위 UX Principles(고밀도, 표준 동선, 더존 정신)는 그대로 유지하고, SmartAdmin 5.5는 그 위에 입히는 룩앤필만 담당한다.
|
||||||
|
|
||||||
|
- 소스: `legacy/smartadmin/`(로컬에 이미 포함된 v5.5 HTML/CSS 데모 패키지, Bootstrap 5 기반). 정확한 색상/여백 값이 필요하면 이 디렉터리를 직접 참조한다(추측 금지).
|
||||||
|
- 적용 범위: **향후 신규 어드민 화면부터**. 기존 20개+ 화면(Dashboard, Blog, Inquiry, Client 등)은 이번엔 재단장하지 않는다. 기존 화면을 다른 이유로 수정할 때 자연스럽게 이 기준으로 수렴시킨다.
|
||||||
|
|
||||||
|
### 매핑 표
|
||||||
|
|
||||||
|
| SmartAdmin 5.5 참조 | 파일 | TaxBaik MudBlazor 대응 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 상단 `<header>` 툴바 | `dashboard-control-center.html` | `AdminShell`의 `MudAppBar` |
|
||||||
|
| `<aside class="app-sidebar">` (로고 + 필터 입력 + 메뉴) | `dashboard-control-center.html` | `AdminShell`의 `MudDrawer` (검색/필터 입력 포함) |
|
||||||
|
| 로그인 카드 (`rounded-4`, 반투명 다크 글래스, `bg-dark bg-opacity-50`) | `auth-login.html` | `AdminLoginForm.razor`의 `MudPaper` 카드 — 반투명/블러 배경 톤 참고 |
|
||||||
|
| 색상 팔레트 | `colorpalette.html`, `css/smartapp.min.css` | `App.razor`의 `MudTheme.Palette` (Primary/Secondary/Tertiary 등) |
|
||||||
|
| 카드형 위젯 | `dashboard-*.html` | `AdminMetricCard`, `MudPaper` 기반 카드 |
|
||||||
|
|
||||||
|
### 적용 규칙
|
||||||
|
|
||||||
|
- 새 어드민 화면을 만들 때: 레이아웃/동선/밀도는 `DOUZONE_UX_GUIDE.md` 상단 원칙을 따르고, 색상·카드 모서리·그림자·로그인류 화면의 톤은 `legacy/smartadmin/`을 참조해 `MudTheme`/CSS 변수로 반영한다.
|
||||||
|
- SmartAdmin 원본은 jQuery/Bootstrap 5 기반이므로 JS/DOM 구조를 그대로 이식하지 않는다. **시각적 토큰(색, 반경, 여백, 타이포그래피)만** 가져오고, 동작은 MudBlazor 컴포넌트로 구현한다.
|
||||||
|
- 기존 화면을 SmartAdmin 스타일로 일괄 재단장하는 작업은 별도 WBS로 `docs/ADMIN_PATTERN_CRITIQUE_WBS.md`에 등록한 뒤 진행한다(이번 범위 아님).
|
||||||
|
|
||||||
|
## Text And Labels
|
||||||
|
|
||||||
|
- 라벨은 짧게 쓴다.
|
||||||
|
- 같은 개념은 같은 단어를 쓴다.
|
||||||
|
- 약어는 화면 전체에서 통일한다.
|
||||||
|
- 운영자가 오해할 수 있는 추상적인 표현은 금지한다.
|
||||||
|
|
||||||
|
## Serving Rules
|
||||||
|
|
||||||
|
- 공개 사이트는 SSR, 어드민은 Blazor WebAssembly 기준으로 본다.
|
||||||
|
- 어드민 화면은 API-first 경유를 기본으로 한다.
|
||||||
|
- JS는 불가피할 때만 사용하고, 모듈로 격리한다.
|
||||||
|
- 상태/메뉴/라우트/버튼은 문자열 흩뿌리기를 금지하고 공통 상수 또는 템플릿으로 묶는다.
|
||||||
|
|
||||||
|
## Reference Rules
|
||||||
|
|
||||||
|
- 이 문서를 어드민 UX의 1차 기준으로 사용한다.
|
||||||
|
- 세부 코드 규칙은 [ENGINEERING_HARNESS.md](./ENGINEERING_HARNESS.md)를 따른다.
|
||||||
|
- 콤보/선택/검색 규칙은 [COMBO_POLICY.md](./COMBO_POLICY.md)를 따른다.
|
||||||
|
- 공통코드/저장값 규칙은 [COMMON_CODE_POLICY.md](./COMMON_CODE_POLICY.md)를 따른다.
|
||||||
|
- 패턴 비판과 WBS는 [ADMIN_PATTERN_CRITIQUE_WBS.md](./ADMIN_PATTERN_CRITIQUE_WBS.md)를 따른다.
|
||||||
|
- 문서 인덱스는 [INDEX.md](./INDEX.md)를 따른다.
|
||||||
|
|
||||||
|
## Prohibited Patterns
|
||||||
|
|
||||||
|
- 목록마다 서로 다른 헤더 구조
|
||||||
|
- 버튼 색과 의미의 중복/충돌
|
||||||
|
- 저장 안 되는 필드를 편집 가능한 척 보여주기
|
||||||
|
- 전역 JS 상태에 의존하는 편집기
|
||||||
|
- 같은 CRUD 화면의 개별 구현체마다 다른 DOM/행 높이/행동 패턴
|
||||||
|
- 불필요한 중첩 컴포넌트와 과한 추상화
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
- 신규 어드민 화면은 이 문서의 레이아웃/컴포넌트 규칙 중 최소 80%를 따른다.
|
||||||
|
- 기존 화면은 새로 건드릴 때 이 문서로 수렴한다.
|
||||||
|
- 화면 추가 시 `PageHeader`, `EmptyState`, `DenseGrid`, `Form` 패턴 중 하나 이상을 재사용한다.
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
# Engineering Harness
|
||||||
|
|
||||||
|
이 문서는 TaxBaik 코드가 매번 흔들리지 않도록 막는 최소 하네스다. 여기에 없는 내용은 추측하지 않고 코드, 테스트, 운영 로그, DB 스키마 중 하나로 확인한다.
|
||||||
|
|
||||||
|
## Non-Negotiables
|
||||||
|
|
||||||
|
| 항목 | 기준 | 실패 판정 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Runtime | ASP.NET Core `net10.0` 기준 유지 | 프로젝트별 TargetFramework 불일치 |
|
||||||
|
| Public UI | 홈페이지/공개 페이지는 서버 사이드 렌더링 기준 | 공개 페이지가 불필요하게 WASM 번들에 의존 |
|
||||||
|
| Admin UI | 어드민은 클라이언트 사이드 Blazor WebAssembly + MudBlazor + API-first | 어드민 컴포넌트가 Application/Repository를 직접 주입 |
|
||||||
|
| API | 모든 운영 기능은 `/api/*` DTO 경유 | UI 전용 서비스 호출만 존재 |
|
||||||
|
| Auth | JWT 인증, 관리자 API는 `[Authorize]` | 익명으로 관리자 데이터 접근 가능 |
|
||||||
|
| Deploy | Gitea Actions CI/CD만 배포 경로 | 수동 SSH/복사로 운영 반영 |
|
||||||
|
| Evidence | 빌드, 테스트, E2E, API smoke 로그 | "확인함", "될 것" 같은 진술 |
|
||||||
|
| Admin Render | Router/Routes에는 전역 `@rendermode`를 두지 않고 페이지별로 지정한다. 로그인 페이지만 `prerender: true`로 최초 HTML에 폼을 포함시키고, 나머지 `[Authorize]` 페이지는 `prerender: false`를 유지한다 | Router/Routes에 전역 렌더모드가 다시 생기거나, 로그인 폼이 최초 HTML에 없다 |
|
||||||
|
| KST Timestamp | CI/배포/백업 폴더명과 추적 일시는 `TZ=Asia/Seoul` | `date`가 기본 UTC 또는 서버 로캘에 종속 |
|
||||||
|
| Repo Root | 소스는 `src/`, 문서는 `docs/`, 테스트는 `tests/`, 스크립트는 `scripts/`, 마이그레이션은 `db/`, 배포 참조 설정은 `deploy/`에 둔다. 루트에는 진입점 설정(`CLAUDE.md`, `README.md`, `.gitignore`, `package.json` 등)만 남긴다 | 루트에 스크린샷/로그/1회성 디버그 스크립트/빌드 산출물이 커밋된다 |
|
||||||
|
|
||||||
|
## Architecture Guardrails
|
||||||
|
|
||||||
|
- Domain은 엔티티, enum, repository interface만 가진다.
|
||||||
|
- Application은 use case와 검증 규칙을 가진다. HTTP, JS, MudBlazor, DB 연결 세부를 모른다.
|
||||||
|
- Infrastructure는 Dapper SQL과 외부 시스템 구현을 가진다.
|
||||||
|
- Web은 Controller, 공개 Razor Pages SSR, Blazor host, 인증/서빙 설정을 가진다.
|
||||||
|
- Web.Client/Admin UI는 클라이언트 사이드 Blazor WebAssembly로 본다. 서버 DI 서비스에 의존하지 않고 API client만 호출한다.
|
||||||
|
- 관리자 호스트가 prerender를 사용하더라도 데이터 접근 원칙은 WASM + API-first다. prerender는 초기 마크업용이며 비즈니스 로직의 근거가 아니다.
|
||||||
|
- 어드민 기본 렌더는 WASM이다. 다만 초기 흰 화면 방지 목적의 셸 프리렌더와 로그인 화면의 서버 프리렌더는 허용한다. 비즈니스 로직은 여전히 API-first다.
|
||||||
|
- 로그인 화면은 예외적으로 “먼저 보여야 하는 화면”이다. JS 바인딩/텔레메트리/하이드레이션이 실패해도 로그인 폼 자체는 화면에 남아 있어야 하며, 실패 시 흰 화면이나 빈 본문을 허용하지 않는다.
|
||||||
|
- 로그인 화면은 공통 추적보다 가시성을 우선한다. 추적은 보조이며, 로그인 폼 렌더를 가로막는 코드는 금지한다.
|
||||||
|
- 로그인 화면의 JS는 `try/catch`로 감싸고, 실패해도 사용자 입력과 화면 표시를 막지 않아야 한다.
|
||||||
|
- JavaScript는 최소화한다. 브라우저 API, 인증 토큰 저장, 서드파티 편집기처럼 Blazor/MudBlazor만으로 해결하기 부적절한 경우에만 JS module로 격리한다.
|
||||||
|
- 상속은 프레임워크 요구 또는 명확한 다형성 모델에만 사용한다. 폼/테이블/CRUD 재사용은 기본적으로 컴포넌트 합성과 작은 service/client로 처리한다.
|
||||||
|
- 과유불급을 지킨다. 실제 재사용이 2곳 미만이면 새 추상화를 만들지 말고 기존 컴포넌트를 직접 조합한다.
|
||||||
|
- CI, 배포 폴더명, 백업명, 버전 추적에 쓰는 시간 문자열은 `TZ=Asia/Seoul`을 기본으로 한다.
|
||||||
|
- 클라이언트 오류 수집은 서버/브라우저를 보호하는 목적의 제한형 수집으로만 운영한다. 건당 비동기 전송, 중복 억제, 분당 상한, 서버 rate limit, 실패 시 조용히 폐기, 재시도 폭주 금지.
|
||||||
|
- 브라우저에서 발생한 JS 오류는 운영 장애 탐지를 위한 샘플 데이터로만 취급하고, 전체 이벤트 스트림을 보존하려는 설계는 금지한다.
|
||||||
|
- 텔레그램 알림은 운영자의 주의 채널이지 이벤트 버스가 아니다. 같은 원인/같은 기간의 중복 알림은 억제하고, 리포트/오류/문의/시작 장애는 종류별 시간창을 분리한다.
|
||||||
|
- 오류 알림에는 재현성 6요소를 포함한다: 화면, 기능, 액션, 단계, 데이터 식별자, 현재 라우트. 이 정보가 없으면 운영 대응이 끝나지 않은 것으로 본다.
|
||||||
|
- 루트에 새 파일을 직접 추가하지 않는다. 소스는 `src/`, 문서는 `docs/`, 테스트는 `tests/`, 스크립트는 `scripts/`, 마이그레이션은 `db/`, 배포 참조 설정은 `deploy/`에 둔다.
|
||||||
|
- 임시/스크래치 작업(스크린샷, 1회성 디버그 스크립트, 로그)은 저장소 밖(OS/세션 임시 폴더)에서 하고 절대 커밋하지 않는다. 저장소 안에서 꼭 필요하면 `.gitignore`에 등록된 `.scratch/`만 사용한다.
|
||||||
|
- 커밋 전 `git status`로 루트에 낯선 파일이 생기지 않았는지 확인한다. 빌드 산출물(runtimeconfig.json, deps.json, wwwroot 산출물 등)이 루트나 프로젝트 폴더 밖에 커밋되면 안 된다.
|
||||||
|
- 재현 맥락은 페이지별 수동 JS 호출이 아니라 `AdminTelemetryContext` 같은 공통 컴포넌트가 담당한다. 새 어드민 화면은 레이아웃 경유 기본값을 자동 상속해야 하며, 예외만 명시적으로 덮어쓴다.
|
||||||
|
|
||||||
|
## Code Quality Harness
|
||||||
|
|
||||||
|
| 원칙 | 적용 방식 |
|
||||||
|
| --- | --- |
|
||||||
|
| SOLID | 페이지는 orchestration만, 검증은 Application, 저장은 Repository, HTTP 계약은 DTO |
|
||||||
|
| 유지보수 | Blog/Inquiry 같은 CRUD는 `List`, `Form`, `Client`, `Dto`, `Validator` 패턴으로 고정 |
|
||||||
|
| 리팩토링 | 동작 보존 테스트를 먼저 추가하고 작은 단위로 이동 |
|
||||||
|
| 일관성 | 오류 응답은 ProblemDetails, 페이징은 `{ data, total, page, pageSize }` |
|
||||||
|
| 파편화 방지 | 같은 필드/상태/서비스유형 문자열은 enum/상수/공통 코드 중 하나로 단일화 |
|
||||||
|
| 과유불급 | 추상화는 2개 이상 실제 사용처가 생긴 뒤 도입 |
|
||||||
|
| 정규화 | 고객, 문의, 상담, 계약, 세금신고는 원천 테이블을 분리 |
|
||||||
|
| 역정규화 | 대시보드/검색/운영 요약용 스냅샷만 허용하고 원천 id와 갱신 시점을 저장 |
|
||||||
|
| 충돌방지 | 수정 API는 가능하면 `updatedAt` 또는 row version 기반 충돌 감지를 둔다 |
|
||||||
|
| 더존 UX 정신 | 더존 세무회계프로그램처럼 고밀도, 표준 동선, 빠른 입력, 상태 가시성, 회귀 최소화를 기본 UX 원칙으로 삼는다 |
|
||||||
|
| 추측금지 | 세법, 세율, 더존 필드, 운영 계정, 배포 결과는 공식 자료/코드/DB/로그 없이는 단정하지 않는다 |
|
||||||
|
| JS 최소화 | Blazor/MudBlazor 우선, 불가피한 JS는 module + dispose + 테스트 가능한 얇은 wrapper |
|
||||||
|
| 공통코드 | 상태/유형/출처/위험도는 `common_codes`를 우선 소스로 사용하고 화면 하드코딩을 금지 |
|
||||||
|
|
||||||
|
## Data Integrity Harness
|
||||||
|
|
||||||
|
- DB 제약 조건이 1차 방어선이다: NOT NULL, UNIQUE, FK, CHECK, index.
|
||||||
|
- Application validation은 사용자 메시지와 use case 규칙을 담당한다.
|
||||||
|
- UI validation은 빠른 피드백일 뿐이며 유일한 검증으로 보지 않는다.
|
||||||
|
- 관리자 수정 화면에 노출한 필드는 실제 저장되어야 한다. 저장하지 않는 필드는 read-only로 표시한다.
|
||||||
|
- 상태 전이는 허용 목록을 둔다. 임의 문자열 저장을 금지한다.
|
||||||
|
- 삭제는 운영 데이터 손실 위험이 있으면 soft delete 또는 archive를 우선 검토한다.
|
||||||
|
- 콤보 값은 [COMMON_CODE_POLICY.md](./COMMON_CODE_POLICY.md)를 1차 기준으로 삼는다.
|
||||||
|
- 로그인 화면은 배포 전 브라우저 실증이 필수다. `dotnet build`만으로 로그인 화면 정상 표시를 완료로 선언하지 않는다.
|
||||||
|
- 로그인 화면 실증 기준은 최소 1회 실제 브라우저 응답, 로그인 폼 렌더, 입력 포커스 가능 여부 확인이다.
|
||||||
|
- 클라이언트 로그와 장애 진단 로그는 운영 데이터가 아니라 관측 데이터로 본다. 저장 실패는 사용자 흐름을 막지 않으며, 수집 실패 자체를 재시도 루프로 증폭하지 않는다.
|
||||||
|
- 동일 오류의 텔레그램 재알림은 일정 기간 1회로 제한하고, 재전송 목적의 루프는 금지한다.
|
||||||
|
- 데이터가 오류 재현에 필요하면 `entity`, `entityId`, `dataKey` 같은 최소 식별자만 남기고, 원문 데이터 전체를 로그에 싣지 않는다.
|
||||||
|
|
||||||
|
## API-First Admin Pattern
|
||||||
|
|
||||||
|
새 어드민 기능은 클라이언트 사이드 Blazor WebAssembly를 기준으로 아래 구조를 기본 템플릿으로 따른다.
|
||||||
|
|
||||||
|
| Layer | Naming | 책임 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| DTO | `CreateXRequest`, `UpdateXRequest`, `XResponse` | HTTP 계약 |
|
||||||
|
| Controller | `XController` | 인증, 라우팅, status code, ProblemDetails |
|
||||||
|
| Client | `IXBrowserClient`, `XBrowserClient` | JWT 포함 HTTP 호출 |
|
||||||
|
| Page | `XList.razor`, `XCreate.razor`, `XEdit.razor` | 화면 상태와 navigation |
|
||||||
|
| Form | `XForm.razor` | 입력 컴포넌트와 UI validation |
|
||||||
|
| Tests | unit + Playwright/API smoke | 회귀 방지 |
|
||||||
|
|
||||||
|
## Rendering Boundary
|
||||||
|
|
||||||
|
| 영역 | 렌더링 | 데이터 접근 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Public Home/Blog/Contact | 서버 사이드 렌더링 | 서버 Application Service 직접 사용 가능 |
|
||||||
|
| Admin | 클라이언트 사이드 Blazor WebAssembly | JWT 포함 HTTP API만 사용 |
|
||||||
|
| Shared DTO | 서버/클라이언트 공유 가능 | UI 전용 상태와 DB 엔티티를 섞지 않음 |
|
||||||
|
|
||||||
|
공개 페이지의 SEO와 초기 로딩은 SSR로 최적화한다. 어드민은 앱처럼 동작해야 하므로 WebAssembly와 API 계약을 기준으로 설계한다.
|
||||||
|
|
||||||
|
## CI Harness
|
||||||
|
|
||||||
|
완료는 로컬 성공이 아니라 CI와 배포본 성공이다.
|
||||||
|
|
||||||
|
| Gate | Command/Check | Target |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Build | `dotnet build src/TaxBaik.sln -c Release --no-restore` | error 0 |
|
||||||
|
| Unit | `dotnet test src/TaxBaik.sln -c Release --no-build` | failed 0 |
|
||||||
|
| Browser | `npx playwright test --project="Desktop Chrome"` | failed 0 |
|
||||||
|
| API Smoke | login + protected admin API curl | HTTP 2xx |
|
||||||
|
| Deploy | `.gitea/workflows/deploy.yml` | success |
|
||||||
|
| Post Deploy | `.gitea/workflows/browser-e2e.yml` | success |
|
||||||
|
|
||||||
|
### Gitea Auth Harness
|
||||||
|
|
||||||
|
- Gitea API와 workflow dispatch에는 `GITEA_TOKEN_TAXBAIK`만 사용한다.
|
||||||
|
- `GITEA_TOKEN`은 쓰지 않는다.
|
||||||
|
- 인증 헤더는 `Authorization: token <GITEA_TOKEN_TAXBAIK>`를 기본으로 한다.
|
||||||
|
- 토큰 검증은 먼저 `GET /api/v1/user`로 확인하고, 그 다음 `workflow_dispatch`를 실행한다.
|
||||||
|
- `401 invalid username, password or token`이 나오면 토큰 이름, 공백, 환경 변수 scope를 먼저 확인한다.
|
||||||
|
|
||||||
|
## Stop Conditions
|
||||||
|
|
||||||
|
- 동일 개념이 3곳 이상 다른 이름/계약으로 구현되면 기능 추가를 중단하고 정리한다.
|
||||||
|
- UI가 저장한다고 보이는 필드를 API/Application이 저장하지 않으면 릴리스하지 않는다.
|
||||||
|
- 운영 배포 검증이 CI 밖에서만 가능하면 완료로 보지 않는다.
|
||||||
|
- 데이터 모델을 추측해서 세무 규칙이나 더존 UX 관습을 왜곡해 구현하지 않는다.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# TaxBaik Engineering Index
|
||||||
|
|
||||||
|
이 디렉터리의 문서만 현재 개발 기준의 기준점으로 사용한다. 다른 문서는 보조 자료로만 본다.
|
||||||
|
|
||||||
|
## Canonical Documents
|
||||||
|
|
||||||
|
| 문서 | 용도 | 변경 조건 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| [ENGINEERING_HARNESS.md](./ENGINEERING_HARNESS.md) | 아키텍처, 코드 품질, 배포, 데이터 정합성 하네스 | 방향성 변경 또는 반복 위반 발견 |
|
||||||
|
| [DOUZONE_UX_GUIDE.md](./DOUZONE_UX_GUIDE.md) | 더존식 어드민 UX 원칙, 템플릿, 컴포넌트, 서빙 규칙 | 화면 패턴 변경 또는 신규 템플릿 추가 |
|
||||||
|
| [COMMON_CODE_POLICY.md](./COMMON_CODE_POLICY.md) | 공통코드, 저장값, 컬럼 길이, 하드코딩 금지 규칙 | 공통코드 또는 콤보 추가/수정 |
|
||||||
|
| [COMBO_POLICY.md](./COMBO_POLICY.md) | 콤보/선택/검색 입력 정책과 저장값 규칙 | 상태/유형/선택 입력 정책 변경 |
|
||||||
|
| [ADMIN_PATTERN_CRITIQUE_WBS.md](./ADMIN_PATTERN_CRITIQUE_WBS.md) | 어드민 Blog/문의 등록 패턴 비판, 개선 로드맵, 정량 WBS | WBS 상태 또는 성공 지표 변경 |
|
||||||
|
|
||||||
|
## Route And Serving Map
|
||||||
|
|
||||||
|
| 영역 | 라우트/파일 | 기준 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Public Home/Blog/Contact | `/taxbaik/`, `/taxbaik/blog`, `/taxbaik/contact` | 서버 사이드 렌더링, SEO 우선, WASM 의존 금지 |
|
||||||
|
| Admin Blog | `/taxbaik/admin/blog`, `/taxbaik/admin/blog/create`, `/taxbaik/admin/blog/{id}/edit` | 클라이언트 사이드 Blazor WebAssembly, API-first 클라이언트 경유, JS 최소화 |
|
||||||
|
| Admin Inquiry | `/taxbaik/admin/inquiries`, `/taxbaik/admin/inquiries/create`, `/taxbaik/admin/inquiries/{id}/edit` | 클라이언트 사이드 Blazor WebAssembly, 공개 접수/관리자 등록/상태 변경 분리 |
|
||||||
|
| Public API | `/taxbaik/api/*` | JWT 인증, ProblemDetails 오류, DTO 입출력 |
|
||||||
|
| CI/CD | `.gitea/workflows/deploy.yml`, `.gitea/workflows/browser-e2e.yml` | 수동 배포 금지, 배포본 E2E 통과 후 완료 |
|
||||||
|
|
||||||
|
## Shared Component Map
|
||||||
|
|
||||||
|
| 컴포넌트 | 용도 | 대표 사용처 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `AdminShell` | 관리자 상단바/드로워/버전/알림 공통 shell | `Components/Admin/Layout/MainLayout.razor` |
|
||||||
|
| `AdminLoginForm` | 관리자 로그인 입력/제출 UI | `Components/Admin/Pages/Login.razor` |
|
||||||
|
| `AdminPageHeader` | 페이지 타이틀/보조설명/주요 액션 | Blog, Inquiry, Client, FAQ 목록 |
|
||||||
|
| `AdminDataPanel` | 목록/표면/로딩 스켈레톤 공통 래퍼 | Blog, Inquiry, CommonCode, Dashboard |
|
||||||
|
| `AdminEditorPanel` | 편집형 스켈레톤 래퍼 | BlogEdit, InquiryEdit, ClientEdit, CompanyEdit, FAQEdit |
|
||||||
|
| `AdminSkeletonRows` | 반복 로딩 골격 | AdminDataPanel, AdminEditorPanel, Dashboard |
|
||||||
|
| `AdminMetricCard` | 대시보드 KPI 카드 | `Components/Admin/Pages/Dashboard.razor` |
|
||||||
|
| `AdminEmptyState` | empty/empty-filter 상태 | ClientList 등 목록 화면 |
|
||||||
|
| `AdminFormSection` | 폼 입력 섹션 구획 | BlogForm, InquiryForm |
|
||||||
|
| `AdminFormActions` | 제출/취소 버튼 묶음 | BlogForm, InquiryForm |
|
||||||
|
| `AdminDetailSection` | 상세 정보 카드 | InquiryDetail |
|
||||||
|
| `AdminCrudPageShell` | create/edit 페이지 공통 헤더+취소+편집 래퍼 | BlogCreate/Edit, InquiryCreate/Edit |
|
||||||
|
| `CommonCodeGroupPanel` | 공통코드 그룹 선택/추가 패널 | CommonCodes |
|
||||||
|
| `CommonCodeListPanel` | 공통코드 목록/편집 패널 | CommonCodes |
|
||||||
|
|
||||||
|
## Document Rules
|
||||||
|
|
||||||
|
- 문서는 짧게 유지한다. 새 문서를 만들기 전에 이 인덱스에 추가할 가치가 있는지 판단한다.
|
||||||
|
- 동일한 기준을 여러 문서에 중복 작성하지 않는다.
|
||||||
|
- 아키텍처/UX/콤보/공통코드 기준은 `ENGINEERING_HARNESS.md`, `DOUZONE_UX_GUIDE.md`, `COMBO_POLICY.md`, `COMMON_CODE_POLICY.md`만 본다.
|
||||||
|
- WBS 완료 여부는 체크박스가 아니라 수치와 실행 로그로 판단한다.
|
||||||
|
- 코드 변경 시 관련 WBS ID를 커밋/PR 설명 또는 작업 메모에 남긴다.
|
||||||
|
- 공통코드 관련 규칙은 [COMMON_CODE_POLICY.md](./COMMON_CODE_POLICY.md)만 1차 기준으로 사용한다.
|
||||||
|
- 공유 컴포넌트는 `INDEX.md`의 Shared Component Map을 먼저 확인한다.
|
||||||
@@ -0,0 +1,777 @@
|
|||||||
|
# 블로그 포스트 작성 템플릿
|
||||||
|
|
||||||
|
## 정확성 원칙 (법적 책임 수반)
|
||||||
|
|
||||||
|
블로그는 **사실 기반, 세법 기반, 데이터 기반**이어야 합니다. 추측이나 예상은 법적 문제를 일으킬 수 있습니다.
|
||||||
|
|
||||||
|
### 절대 금지 표현
|
||||||
|
|
||||||
|
- "아마도", "할 것 같다", "추측된다" (추측)
|
||||||
|
- "대략", "정도일 거다", "보통" (예상)
|
||||||
|
- "좋을 것 같다", "나쁠 것 같다" (의견)
|
||||||
|
- 증거 없는 "모두", "항상", "누구나" (일반화)
|
||||||
|
- 출처 없는 통계 ("80% 고객이", "평균 X만 원")
|
||||||
|
|
||||||
|
### 필수 요소
|
||||||
|
|
||||||
|
**1. 세법 기반**:
|
||||||
|
- 모든 주장에 세법/시행령/고시 인용
|
||||||
|
- 조항 명시: "소득세법 제XX조에 따르면"
|
||||||
|
- 최신 기준 명시: "2025년 기준"
|
||||||
|
- 변경사항 반영: "전년도와 다르게..."
|
||||||
|
|
||||||
|
**2. 사실 기반**:
|
||||||
|
- 실제 일어난 고객 사례만 사용
|
||||||
|
- 가정일 경우 명시: "예를 들어, 만약 이렇다면"
|
||||||
|
- 가상 사례는 "예시 사례"라고 명확히
|
||||||
|
- 개인정보는 익명화 (이름, 나이는 일반적인 표현)
|
||||||
|
|
||||||
|
**3. 데이터 기반**:
|
||||||
|
- 객관적 수치만 사용 (국세청 통계, 협회 자료)
|
||||||
|
- 출처 명시: "2025년 세무청 통계에 따르면"
|
||||||
|
- 구체적 금액: "약 50만 원" (범위 표현)
|
||||||
|
- 비교 데이터: "작년 대비 X% 증가"
|
||||||
|
|
||||||
|
**4. 사례 제시 시 확인 사항**:
|
||||||
|
```
|
||||||
|
✅ 실제 고객인가? (공개 가능한 정보만)
|
||||||
|
✅ 세법을 정확하게 적용했는가?
|
||||||
|
✅ 금액 계산이 정확한가?
|
||||||
|
✅ 이 사례가 대표적인가? (극단적 사례면 명시)
|
||||||
|
✅ 다른 고객에게도 적용 가능한가?
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 카테고리 필수 규칙
|
||||||
|
|
||||||
|
**모든 블로그 포스트는 반드시 하나의 카테고리에 할당되어야 합니다. (NOT NULL)**
|
||||||
|
|
||||||
|
### 카테고리별 포스트 배치
|
||||||
|
|
||||||
|
| 카테고리 | 최소 포스트 | 주제 범위 |
|
||||||
|
|---------|-----------|---------|
|
||||||
|
| 사업자 세무 | 3개 | 기장, 세무신고, 부가세, 종합소득세 |
|
||||||
|
| 부동산 세금 | 3개 | 월세, 양도세, 상속세(부동산) |
|
||||||
|
| 종합소득세 | 3개 | 프리랜서, 부업, 경비 처리 |
|
||||||
|
| 부가가치세 | 3개 | 신고, 기한, 간이과세 vs 일반과세 |
|
||||||
|
| 가족자산·증여 | 3개 | 자녀 증여, 상속, 자산 이전 |
|
||||||
|
|
||||||
|
### 카테고리 할당 규칙
|
||||||
|
|
||||||
|
1. **명확한 주제 분류**: 포스트 내용이 카테고리 범위에 명확하게 해당
|
||||||
|
2. **중복 금지**: 한 포스트는 정확히 하나의 카테고리에만 할당
|
||||||
|
3. **균형 배치**: 각 카테고리당 최소 3개씩 (고객 검색 UX)
|
||||||
|
4. **검색 최적화**: 고객이 카테고리로 찾을 때 관련 포스트 3개 이상 노출
|
||||||
|
|
||||||
|
### 카테고리 미할당 시 (오류)
|
||||||
|
- ❌ category_id = NULL (데이터베이스 제약 위반)
|
||||||
|
- ❌ SQL 실행 실패 (NOT NULL 제약)
|
||||||
|
- ❌ 블로그 페이지 노출 불가
|
||||||
|
|
||||||
|
**이 규칙은 모든 포스트 생성/수정 시 필수 준수사항입니다.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 핵심 철학: 고객이 느끼는 여정
|
||||||
|
|
||||||
|
### 1️⃣ 기초: "이 정도는 할 수 있어요"
|
||||||
|
- 고객이 배울 수 있는 기본 개념
|
||||||
|
- 실제 사례로 구체화
|
||||||
|
- 단계별 설명
|
||||||
|
|
||||||
|
### 2️⃣ 현실: "하지만 복잡하네요"
|
||||||
|
- 겹겹이 쌓인 세부사항들
|
||||||
|
- 매년 바뀌는 세법
|
||||||
|
- "이거 일일이 다 챙기기 어렵다"는 느낌
|
||||||
|
|
||||||
|
### 3️⃣ 해결: "세무사와 함께면 괜찮아요"
|
||||||
|
- 디테일 자동 관리
|
||||||
|
- 세법 변화 자동 반영
|
||||||
|
- 고객은 사업에만 집중
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**고객이 글을 읽은 후 느끼는 것**:
|
||||||
|
|
||||||
|
1️⃣ 읽고 나서: "아, 이 정도는 내가 할 수 있겠네"
|
||||||
|
2️⃣ 생각해보니: "근데 이 모든 걸 매년 챙기기는... 힘들겠는데?"
|
||||||
|
3️⃣ 결론: "그럼 전문가 도움을 받는 게 낫겠다"
|
||||||
|
|
||||||
|
→ 자연스럽게 세무사의 필요성을 깨달음 (강요 아님)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 템플릿 (복사해서 사용)
|
||||||
|
|
||||||
|
### Step 1: 도입부 (공감)
|
||||||
|
```markdown
|
||||||
|
# [제목]
|
||||||
|
|
||||||
|
"[구체적 상황]?"
|
||||||
|
"많은 [직업]들이 이 상황을 겪습니다."
|
||||||
|
|
||||||
|
→ 독자가 자신의 상황을 발견하도록
|
||||||
|
```
|
||||||
|
|
||||||
|
**예시**:
|
||||||
|
```markdown
|
||||||
|
# 동네 카페 월세 낼 때 세금이 안 나와요 - 정말 그럴까?
|
||||||
|
|
||||||
|
"사업을 시작했는데 세금을 낸 적이 없어요"
|
||||||
|
"많은 소규모 사업자들이 이렇게 생각합니다."
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 2: 실제 사례 (구체적 페르소나)
|
||||||
|
|
||||||
|
**필수 정보**:
|
||||||
|
- 이름, 나이, 직업, 사업 경력
|
||||||
|
- 월/연간 매출 (현실적 수치)
|
||||||
|
- 실제 겪은 문제/성공 사례
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
### 상황: [지역] [카테고리]를 운영하는 [이름]님 ([나이]세, 사업 [년]차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: [구체적 위치]
|
||||||
|
- 월 매출: [금액]
|
||||||
|
- 월 경비: [주요 항목들]
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요 (실패 사례)
|
||||||
|
→ [실제 실수 1]
|
||||||
|
→ [실제 실수 2]
|
||||||
|
→ **결과**: 세금을 [X만 원] 더 내게 됨 (또는 세무조사 대상)
|
||||||
|
|
||||||
|
### 바뀐 후 (성공 사례)
|
||||||
|
→ [해결책 1]
|
||||||
|
→ [해결책 2]
|
||||||
|
→ **결과**: 세금을 [X만 원] 절약함 (또는 안정적인 운영)
|
||||||
|
```
|
||||||
|
|
||||||
|
**예시**:
|
||||||
|
```markdown
|
||||||
|
### 상황: 강남 역삼동에서 카페를 운영하는 김민수님 (34세, 사업 3년차)
|
||||||
|
|
||||||
|
**기본 정보**:
|
||||||
|
- 위치: 강남역 3번 출구 근처
|
||||||
|
- 월 매출: 약 600만 원 (평일 200만, 주말 400만)
|
||||||
|
- 월 경비: 월세 150만, 재료비 180만, 직원급여 100만 원
|
||||||
|
|
||||||
|
### 원래는 이렇게 했어요
|
||||||
|
→ "세금은 큰 회사나 내는 거라고 생각했어요"
|
||||||
|
→ 영수증도 대충 정리하고
|
||||||
|
→ **결과**: 세무청에서 3년치를 추징받고 가산세까지...손해 70만 원
|
||||||
|
|
||||||
|
### 바뀐 후
|
||||||
|
→ 매달 영수증을 정리해서
|
||||||
|
→ 세무사와 년 1회 기장 상담
|
||||||
|
→ **결과**: 세금도 명확하고, 추징도 없음. 심플하고 안전
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 3: 계산 & 설명
|
||||||
|
|
||||||
|
**구조**:
|
||||||
|
1. **기본 정보 확인** (위에서 제시한 사례 요약)
|
||||||
|
2. **단계별 계산** (Step 1, Step 2, ... 명확히)
|
||||||
|
3. **표로 시각화**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 계산 방법
|
||||||
|
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
|
||||||
|
월 경비 구성:
|
||||||
|
- 월세: 150만 원 (연 1,800만 원)
|
||||||
|
- 재료비: 180만 원 (연 2,160만 원)
|
||||||
|
- 직원급여: 100만 원 (연 1,200만 원)
|
||||||
|
- 기타: 20만 원 (연 240만 원)
|
||||||
|
- **월 합계: 450만 원**
|
||||||
|
- **연 합계: 5,400만 원**
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = **1,800만 원**
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🎭 Step 3.5: 악마는 디테일이다 (선택사항이지만 강력함)
|
||||||
|
|
||||||
|
**구조**: "간단해 보이지만, 실제로는..."
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 겉으로는 간단해 보여요... 하지만
|
||||||
|
|
||||||
|
### 📄 "영수증을 정리하세요"라고 했는데
|
||||||
|
|
||||||
|
**겉으로는**:
|
||||||
|
→ 영수증을 모으기만 하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 이 영수증은 인정되고, 이건 안 됨 (세법)
|
||||||
|
→ 이건 개인비? 사업비? (판단)
|
||||||
|
→ 카드값이랑 현금값이랑 다르면? (대사)
|
||||||
|
→ 3년 지났는데 영수증을 못 찾으면? (소송)
|
||||||
|
→ 세무청이 불인정하면? (항의 절차)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 어떤 영수증이 인정될지 사전에 판단
|
||||||
|
✅ 개인비와 사업비의 경계 명확히
|
||||||
|
✅ 세법 변경사항 적용
|
||||||
|
✅ 세무청 부인시 대응 준비
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📊 "매출과 경비를 기록하세요"라고 했는데
|
||||||
|
|
||||||
|
**겉으로는**:
|
||||||
|
→ 엑셀에 숫자만 입력하면 돼
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 카드 명세서와 입금액이 안 맞음 (환불? 수수료?)
|
||||||
|
→ 한 달간 매출을 빼먹음 (추가 계산)
|
||||||
|
→ 같은 카테고리인데 세법상 다르게 분류돼야 함 (부가세/소득세 다름)
|
||||||
|
→ 작년에 잘못 입력한 게 발견됨 (수정신고)
|
||||||
|
→ 월별로 편차가 커서 세무청이 의심함 (설명 준비)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 카드명세서 vs 입금액 정산
|
||||||
|
✅ 누락된 부분 찾아서 추가
|
||||||
|
✅ 세법상 올바른 분류
|
||||||
|
✅ 이전년도 오류 수정신고
|
||||||
|
✅ 세무청 질의에 대한 근거 제시
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ✅ "정확하게 기장하면 세금이 확정돼요"라고 했는데
|
||||||
|
|
||||||
|
**겉으로는**:
|
||||||
|
→ 기장만 잘하면 세금 끝
|
||||||
|
|
||||||
|
**현실의 디테일**:
|
||||||
|
→ 같은 사업도 절세 방법이 다양함 (어떤 게 맞나?)
|
||||||
|
→ 올해는 이렇게, 내년은 저렇게? (일관성)
|
||||||
|
→ 부가세와 소득세 둘 다 고려해야 함 (연계 계산)
|
||||||
|
→ 세무조사가 오면 3년치를 모두 봄 (소급 처리)
|
||||||
|
→ 이의신청/항소하려면? (법적 절차)
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 최적의 절세 전략 제시
|
||||||
|
✅ 연도별 일관된 기장 방식 유지
|
||||||
|
✅ 부가세/소득세 동시 최적화
|
||||||
|
✅ 세무조사 대비 사전 정리
|
||||||
|
✅ 이의신청/항소 등 법적 대응
|
||||||
|
```
|
||||||
|
|
||||||
|
**💡 핵심**:
|
||||||
|
- 기초는 누구나 배울 수 있어요
|
||||||
|
- **하지만 디테일을 모두 처리하려면?**
|
||||||
|
- **그 디테일들이 바로 세무사가 하는 일**
|
||||||
|
- **디테일 하나 놓쳤다가 가산세 50만 원... 이래서 세무사 비용이 아깝지 않음**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🔄 Step 3.6: 세법은 계속 바뀐다 (매년 업데이트)
|
||||||
|
|
||||||
|
**구조**: "올해의 세법 변화"를 포스트 작성 시점에 맞춰 갱신
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 그런데 세법은 해마다 바뀝니다
|
||||||
|
|
||||||
|
### 📋 [연도] 변경사항들 (꼭 알아야 할 것들)
|
||||||
|
|
||||||
|
**✅ 2025년 부가세 변화**:
|
||||||
|
- 신고 기한이 [날짜]로 변경됨
|
||||||
|
- 영세사업자 기준이 [금액]로 상향조정됨
|
||||||
|
- 새로운 공제 항목이 추가됨: [항목들]
|
||||||
|
|
||||||
|
**✅ 2025년 소득세 변화**:
|
||||||
|
- 기본공제가 [금액]에서 [금액]로 증가
|
||||||
|
- 자녀 공제 조건이 변경됨
|
||||||
|
- 월급 원천징수 기준이 조정됨
|
||||||
|
|
||||||
|
**✅ 2025년 새로운 제도**:
|
||||||
|
- 소상공인 세금 감면 확대
|
||||||
|
- 청년사업자 지원 강화
|
||||||
|
- 부가가치세 간편신청 범위 확대
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**혼자서 할 때의 문제**:
|
||||||
|
❌ "작년 기준으로 기장했는데 올해 기준이 바뀐 거야?"
|
||||||
|
❌ "이 공제가 되는 건지 안 되는 건지 모르겠어"
|
||||||
|
❌ "새로운 제도가 나왔다는 것도 몰랐어"
|
||||||
|
❌ "처음 다시 계산해야 하나?"
|
||||||
|
|
||||||
|
**세무사가 처리하는 것**:
|
||||||
|
✅ 매년 변경사항 자동 추적
|
||||||
|
✅ 당신의 상황에 맞는 새로운 공제 적용
|
||||||
|
✅ 이전년도 재계산 필요시 수정신고
|
||||||
|
✅ 연중 세법 개정 소식 안내
|
||||||
|
✅ 새로운 지원 정책 놓치지 않게 관리
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 결과 비교: 혼자 할 때 vs 세무사와 함께
|
||||||
|
|
||||||
|
**세법 변화 추적**
|
||||||
|
- 혼자: "어? 규칙이 바뀌었네?"
|
||||||
|
- 세무사: 자동으로 적용됨
|
||||||
|
|
||||||
|
**새로운 공제**
|
||||||
|
- 혼자: 놓치기 쉬움
|
||||||
|
- 세무사: 모두 적용됨
|
||||||
|
|
||||||
|
**매년 재계산**
|
||||||
|
- 혼자: 직접 해야 함
|
||||||
|
- 세무사: 자동 갱신
|
||||||
|
|
||||||
|
**마음 편함**
|
||||||
|
- 혼자: 불안감 ("맞나?")
|
||||||
|
- 세무사: 확신 ("전문가가 관리")
|
||||||
|
|
||||||
|
**투자 시간**
|
||||||
|
- 혼자: 당신의 시간
|
||||||
|
- 세무사: 포함 (전문가 비용)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 요약: 왜 세무사가 필요한가
|
||||||
|
|
||||||
|
**기초는 배울 수 있지만**:
|
||||||
|
- 세법은 매년 바뀌고
|
||||||
|
- 당신은 본업이 있어서 추적이 어렵고
|
||||||
|
- 실수 하나가 가산세 50만 원...
|
||||||
|
|
||||||
|
**그래서 세무사가 있으면**:
|
||||||
|
- 변화를 자동으로 적용해주고
|
||||||
|
- 새 제도도 놓치지 않아주고
|
||||||
|
- 당신은 사업에만 집중
|
||||||
|
|
||||||
|
→ **결국 시간, 돈, 스트레스 모두 절약**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 💡 Step 4: 실무 팁 (3~5개)
|
||||||
|
|
||||||
|
**구조**: ✅ 이렇게 하세요 / ❌ 이렇게 하면 안 돼요
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 이렇게 하면 세금이 명확해요
|
||||||
|
|
||||||
|
### ✅ 해야 할 것
|
||||||
|
1. **영수증 정리** - 매달 봉투에 모아두기
|
||||||
|
2. **기본 기록** - 엑셀에 간단히 기입
|
||||||
|
3. **연 1회 점검** - 세무사와 기본 상담
|
||||||
|
4. **투명성** - 세무청 신고는 정확하게
|
||||||
|
|
||||||
|
### ❌ 하면 안 되는 것
|
||||||
|
1. **영수증 버리기** - 나중에 증거 없음
|
||||||
|
2. **개인비와 섞기** - 기장 혼란
|
||||||
|
3. **신고 늦추기** - 가산세 발생
|
||||||
|
4. **과하게 깎기** - 세무조사 리스크
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📝 Step 5: 결론
|
||||||
|
|
||||||
|
고객이 읽은 후 자연스럽게 결론을 내리도록:
|
||||||
|
|
||||||
|
**구조**:
|
||||||
|
1. 기초는 할 수 있다 (긍정)
|
||||||
|
2. 근데 복잡하네요 (현실 직시)
|
||||||
|
3. 그래서 세무사가 필요하구나 (자연스러운 깨달음)
|
||||||
|
|
||||||
|
**고객이 느끼는 여정**:
|
||||||
|
- 처음: "아, 이 정도는 내가 할 수 있겠네"
|
||||||
|
- 중간: "근데 이 모든 걸 매년 챙기기는..."
|
||||||
|
- 결론: "전문가 도움이 낫겠다"
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 기초는 누구나 할 수 있어요
|
||||||
|
|
||||||
|
**이 정도면 자신이 충분히 가능합니다**:
|
||||||
|
- 소규모 사업 (월 500만~1,000만 원)
|
||||||
|
- 단순 경비 (재료, 임차료 등)
|
||||||
|
- 월 1회 정도 기본 정리
|
||||||
|
|
||||||
|
→ 영수증 정리 + 기본 엑셀 기입면 충분
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 하지만 이렇게 복잡하면 전문가 도움이 효율적입니다
|
||||||
|
|
||||||
|
**세무사 상담을 권하는 경우**:
|
||||||
|
- 📊 월 매출이 2,000만 원을 넘어갈 때
|
||||||
|
- 💼 여러 사업을 동시에 운영할 때
|
||||||
|
- 🏠 부동산 등 추가 수입이 있을 때
|
||||||
|
- 📈 직원을 여러 명 두고 있을 때
|
||||||
|
- 🌍 해외 거래나 수입이 있을 때
|
||||||
|
|
||||||
|
### 실제 효과: 숫자로 본 세무사의 가치
|
||||||
|
|
||||||
|
**절세액**
|
||||||
|
- 혼자: X만 원
|
||||||
|
- 세무사: X + 200만 원
|
||||||
|
- 차이: +200만 원 절약
|
||||||
|
|
||||||
|
**세무조사 스트레스**
|
||||||
|
- 혼자: 매년 불안
|
||||||
|
- 세무사: 안정적 대응
|
||||||
|
- 차이: 심리적 안정
|
||||||
|
|
||||||
|
**시간 투자**
|
||||||
|
- 혼자: 월 10시간
|
||||||
|
- 세무사: 월 1시간
|
||||||
|
- 차이: 월 9시간 자유
|
||||||
|
|
||||||
|
**세무사 비용**
|
||||||
|
- 혼자: 0원
|
||||||
|
- 세무사: 약 100만 원/년
|
||||||
|
- 차이: -100만 원
|
||||||
|
|
||||||
|
**실제 이익**
|
||||||
|
- 혼자: 순이익
|
||||||
|
- 세무사: 순이익 + 100만 원
|
||||||
|
- 차이: +100만 원 순이익
|
||||||
|
|
||||||
|
**돈을 쓰는 이유**:
|
||||||
|
- 세금 절약: 절세 200만 원 - 비용 100만 원 = 순 100만 원 이득
|
||||||
|
- 시간 절약: 월 9시간(연 108시간) = 사업에 집중
|
||||||
|
- 스트레스 감소: 세무조사 불안 제거
|
||||||
|
- 리스크 관리: 실수로 인한 가산세 방지
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 요약
|
||||||
|
|
||||||
|
**기본 개념을 아는 것만으로도**:
|
||||||
|
- 실수를 줄이고
|
||||||
|
- 세금을 절약하고
|
||||||
|
- 세무사와의 상담이 훨씬 효율적
|
||||||
|
|
||||||
|
당신의 상황이 어느 정도인지 판단하고,
|
||||||
|
필요할 때 전문가와 함께 하세요.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 작성 체크리스트
|
||||||
|
|
||||||
|
### 내용
|
||||||
|
- [ ] **실제 사례**: 동네 카페/편의점/학원 같은 주변 상황
|
||||||
|
- [ ] **구체적 페르소나**: 이름, 나이, 직업, 사업 경력
|
||||||
|
- [ ] **실제 금액**: 매출, 경비, 세금 (현실적 수치)
|
||||||
|
- [ ] **Before/After**: 실패 사례 → 성공 사례
|
||||||
|
- [ ] **절세 효과**: "X만 원 절약" 또는 "손해를 막음"
|
||||||
|
- [ ] **계산**: Step별로 명확, 표 포함
|
||||||
|
- [ ] **악마는 디테일**: "겉으로는 간단해 보이지만 실제로는..." (세무사가 처리하는 디테일들)
|
||||||
|
- [ ] **세법 변화**: 해당 연도의 세법 변경사항과 그 영향 설명
|
||||||
|
|
||||||
|
### 톤
|
||||||
|
- [ ] **교육적**: 개념을 이해하도록
|
||||||
|
- [ ] **격려적**: 경고/협박 없음
|
||||||
|
- [ ] **현실적**: 복잡할 수 있다는 인정
|
||||||
|
- [ ] **세무사 자연스러운 유도**: "필요할 때 도움되는 선택"
|
||||||
|
- [ ] **임파워먼트**: "기초는 누구나 할 수 있어요"
|
||||||
|
|
||||||
|
### 표현
|
||||||
|
- [ ] **중학교 수준**: 어려운 용어는 () 설명
|
||||||
|
- [ ] **이모지**: 🏠💰✅❌📊 등으로 시각화
|
||||||
|
- [ ] **짧은 문장**: 한 문장에 한 개념
|
||||||
|
- [ ] **표와 리스트**: 수치는 표로, 항목은 리스트로
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚫 피해야 할 표현 (한국세무사협회 광고 규칙 준수)
|
||||||
|
|
||||||
|
### ❌ **절대 금지 표현** (법적 위반 위험)
|
||||||
|
|
||||||
|
**1. 과도한 절세 약속 & 절대 표현**:
|
||||||
|
- ❌ "50만 원 절약 가능"
|
||||||
|
- ❌ "최대한 경비를 깎아줍니다"
|
||||||
|
- ❌ "세금을 반으로 줄여드립니다"
|
||||||
|
- ❌ "세금을 덜 냅니다" (보장으로 해석)
|
||||||
|
- ❌ "가장 많이 절세해드립니다"
|
||||||
|
- ✅ "이 사례에서는 약 50만 원 절약되었습니다" (과거 사례만)
|
||||||
|
- ✅ "정확한 경비 처리로 세법에 따른 정당한 공제를 받을 수 있습니다" (법적 근거)
|
||||||
|
- ✅ "경비를 빠짐없이 처리합니다" (객관적 프로세스)
|
||||||
|
|
||||||
|
**2. 보장 표현 (불가능한 결과 약속)**:
|
||||||
|
- ❌ "반드시 세금을 줄입니다"
|
||||||
|
- ❌ "세무조사 안 받게 해드립니다"
|
||||||
|
- ❌ "100% 절세를 보장합니다"
|
||||||
|
- ❌ "세금을 보장합니다"
|
||||||
|
- ✅ "정확한 신고로 세무조사 리스크를 최소화합니다"
|
||||||
|
- ✅ "세법에 따른 정당한 공제를 받을 수 있습니다"
|
||||||
|
|
||||||
|
**3. 무료 & 가격 표현**:
|
||||||
|
- ❌ "무료로 세금 절약해드립니다"
|
||||||
|
- ❌ "최저가 신고료"
|
||||||
|
- ❌ "가장 저렴한 가격"
|
||||||
|
- ✅ "합리적인 비용으로 전문 서비스를 제공합니다"
|
||||||
|
|
||||||
|
**4. 절대/최상급 표현**:
|
||||||
|
- ❌ "반드시", "무조건", "반듯이", "항상", "절대"
|
||||||
|
- ❌ "최고", "최우수", "1등", "유일"
|
||||||
|
- ❌ "모든", "완벽하게"
|
||||||
|
- ✅ "일반적으로", "대부분의 경우", "보통"
|
||||||
|
|
||||||
|
**5. 과도한 단순화 표현**:
|
||||||
|
- ❌ "매우 편합니다", "너무 쉽습니다"
|
||||||
|
- ❌ "아무도 실수할 수 없습니다"
|
||||||
|
- ❌ "5분이면 끝납니다"
|
||||||
|
- ✅ "기초 개념을 배울 수 있습니다"
|
||||||
|
- ✅ "복잡한 부분은 전문가가 관리합니다"
|
||||||
|
|
||||||
|
**6. 객관적 증거 없는 수치**:
|
||||||
|
- ❌ "평균 170만 원 절약" (근거 없으면)
|
||||||
|
- ❌ "고객의 80%가 만족" (통계 없으면)
|
||||||
|
- ❌ "보통 2배의 환급" (데이터 없으면)
|
||||||
|
- ✅ "이 사례에서는 약 170만 원 절약되었습니다"
|
||||||
|
- ✅ "많은 고객들이 정확한 기장의 필요성을 느낍니다"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ✅ **안전한 표현 (권장)**
|
||||||
|
|
||||||
|
| 대신 이렇게 | 이유 |
|
||||||
|
|----------|------|
|
||||||
|
| "정확한 기장으로 세법에 따른 공제를 받을 수 있습니다" | 법적 근거 (보장 아님) |
|
||||||
|
| "경비를 빠짐없이 처리합니다" | 객관적 프로세스 |
|
||||||
|
| "이 사례에서는 약 50만 원 절약되었습니다" | 과거 사례 (보장 아님) |
|
||||||
|
| "경비를 빠짐없이 처리합니다" | 객관적 프로세스 |
|
||||||
|
| "세무조사 대비 근거를 정리합니다" | 예방적 표현 |
|
||||||
|
| "당신의 상황에 맞는 최선의 방법을 제시합니다" | 개별 맞춤형 |
|
||||||
|
| "세법이 자주 바뀌므로 전문가 도움이 효율적입니다" | 필요성 설명 |
|
||||||
|
| "이 정도는 자신이 충분히 가능합니다" | 존중과 임파워먼트 |
|
||||||
|
| "복잡한 경우는 전문가와 상담하세요" | 선택지 제시 |
|
||||||
|
| "정확하게 하면 나중에 편합니다" | 미래 가치 (현재 보장 아님) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📋 블로그 작성 시 광고 규칙 체크리스트
|
||||||
|
|
||||||
|
- [ ] **절세 약속 제거**: "최대한", "반드시", "보장", "무조건" 단어 없음
|
||||||
|
- [ ] **보장 표현 제거**: "세무조사 안 받게", "100% 절세", "확실" 제거
|
||||||
|
- [ ] **무료/가격 표현 제거**: "무료", "최저가", "가장 저렴" 제거
|
||||||
|
- [ ] **절대 표현 제거**: "항상", "절대", "모두", "완벽" 제거
|
||||||
|
- [ ] **최상급 제거**: "최고", "최우수", "1등" (객관적 증거 있으면 가능)
|
||||||
|
- [ ] **과도한 단순화 제거**: "매우 쉽습니다", "아무도 실수할 수 없음" 제거
|
||||||
|
- [ ] **수치는 사례로**: "절약 가능" → "이 사례에서는 약 X만 원 절약"
|
||||||
|
- [ ] **객관성 유지**: 구체적 사례 + 과거형 표현 사용
|
||||||
|
- [ ] **필요성 설명**: "왜 필요한가" → 이해와 선택 유도
|
||||||
|
- [ ] **세무사협회 규정 준수**: 법적 문제 없음
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 시즌별 주제 예시
|
||||||
|
|
||||||
|
| 월 | 추천 주제 | 톤 |
|
||||||
|
|----|---------|-----|
|
||||||
|
| 1월 | 부가세 2기 신고 기한 | "이 정도면 자신이 가능" |
|
||||||
|
| 5월 | 종소세 신고 방법 | "핵심 개념 + 전문가 도움 타이밍" |
|
||||||
|
| 7월 | 부가세 1기 신고 | "기초 정리 방법" |
|
||||||
|
| 11월 | 다음해 준비 | "계획하면 편해요" |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ 실수 방지 체크리스트 (과거 오류 기록)
|
||||||
|
|
||||||
|
**이전에 반복된 실수들을 기록하여, 같은 실수를 하지 않도록 합니다.**
|
||||||
|
|
||||||
|
### 1️⃣ 카테고리 할당 실수 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 포스트를 만들 때 category_id를 NULL로 두었음
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- DB NOT NULL 제약 위반
|
||||||
|
- 블로그 페이지에 노출 안 됨
|
||||||
|
- 고객이 카테고리로 검색 불가
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **SQL INSERT 시 반드시 category_id 명시**
|
||||||
|
- ✅ **포스트 작성 전에 카테고리 결정**
|
||||||
|
- ✅ **DB 적용 후 category_id NOT NULL 확인**
|
||||||
|
- ✅ **각 카테고리별 최소 3개 이상 포스트 유지**
|
||||||
|
|
||||||
|
**SQL 예시** (권장):
|
||||||
|
```sql
|
||||||
|
INSERT INTO blog_posts (title, slug, content, category_id, is_published, ...)
|
||||||
|
VALUES ('제목', 'slug', $$본문$$, 1, true, ...);
|
||||||
|
-- category_id 절대 생략 금지!
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2️⃣ 내용 길이 부족 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 에이전트가 지침(1,500~2,500자)을 무시하고 간단한 버전(500자)으로 생성
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- 고객 설득력 부족
|
||||||
|
- 계산 예시 없음
|
||||||
|
- 3단계 구조 불완전
|
||||||
|
- 세법 인용 부족
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **각 포스트 최소 1,500자 이상 (추천 2,000~2,500자)**
|
||||||
|
- ✅ **포스트 작성 후 글자 수 확인: `LENGTH(content) >= 1500`**
|
||||||
|
- ✅ **항상 실제 사례 포함** (이름, 나이, 직업, 구체적 상황)
|
||||||
|
- ✅ **항상 계산 과정 포함** (절세액 수치화)
|
||||||
|
- ✅ **3단계 구조 필수** (1️⃣ 기초 → 2️⃣ 현실 → 3️⃣ 해결책)
|
||||||
|
|
||||||
|
**확인 쿼리**:
|
||||||
|
```sql
|
||||||
|
SELECT id, title, LENGTH(content) as length FROM blog_posts
|
||||||
|
WHERE LENGTH(content) < 1500; -- 부족한 포스트 검출
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3️⃣ 테이블 사용 금지 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 마크다운 테이블(`| |---|---|`) 사용
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- 지침 위반 (리스트만 사용)
|
||||||
|
- 모바일에서 가독성 저하
|
||||||
|
- 유지보수 어려움
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **테이블 금지, 리스트만 사용** (- 또는 숫자 목록)
|
||||||
|
- ✅ **작성 후 `| |` 패턴 검색으로 테이블 확인**
|
||||||
|
- ✅ **수치/계산은 리스트 형식**:
|
||||||
|
|
||||||
|
**❌ 금지 (테이블)**:
|
||||||
|
```markdown
|
||||||
|
| 항목 | 월 | 연간 |
|
||||||
|
|------|-----|------|
|
||||||
|
| 월세 | 150만 | 1,800만 |
|
||||||
|
```
|
||||||
|
|
||||||
|
**✅ 권장 (리스트)**:
|
||||||
|
```markdown
|
||||||
|
월 경비 구성:
|
||||||
|
- 월세: 150만 원 (연 1,800만 원)
|
||||||
|
- 재료비: 180만 원 (연 2,160만 원)
|
||||||
|
- 직원급여: 100만 원 (연 1,200만 원)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4️⃣ 계산 예시 누락 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 포스트에 개념만 있고 실제 계산 예시 부족
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- 고객이 "내 상황에 얼마나 해당하나" 판단 어려움
|
||||||
|
- 추상적 설명으로 설득력 감소
|
||||||
|
- 세무사 필요성 전달 미흡
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **모든 포스트에 구체적 계산 예시 필수**
|
||||||
|
- ✅ **절세액을 수치로 제시** ("약 50만 원 절약")
|
||||||
|
- ✅ **단계별 계산 과정 포함** (Step 1️⃣, 2️⃣, 3️⃣, 4️⃣)
|
||||||
|
- ✅ **실제 사례로 숫자 구체화**:
|
||||||
|
|
||||||
|
**예시**:
|
||||||
|
```markdown
|
||||||
|
### Step 1️⃣: 매출 정리
|
||||||
|
월 600만 원 × 12개월 = 연 7,200만 원
|
||||||
|
|
||||||
|
### Step 2️⃣: 경비 계산
|
||||||
|
- 월세: 150만 원 → 연 1,800만 원
|
||||||
|
- 재료비: 180만 원 → 연 2,160만 원
|
||||||
|
합계: 5,400만 원
|
||||||
|
|
||||||
|
### Step 3️⃣: 순이익
|
||||||
|
7,200만 - 5,400만 = 1,800만 원
|
||||||
|
|
||||||
|
### Step 4️⃣: 세금
|
||||||
|
1,800만 원 × 약 6% = **약 108만 원/년**
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5️⃣ 카테고리 주제 불일치 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 포스트 주제와 카테고리가 맞지 않음
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- 고객이 원하는 정보 검색 불가
|
||||||
|
- 카테고리 신뢰도 저하
|
||||||
|
- UX 혼란
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **포스트 작성 전 카테고리 명확히 결정**
|
||||||
|
- ✅ **포스트 주제와 카테고리 일관성 검증**:
|
||||||
|
|
||||||
|
| 포스트 | 카테고리 | 확인 |
|
||||||
|
|--------|---------|------|
|
||||||
|
| 프리랜서 경비 | 종합소득세 (3) | ✅ 맞음 |
|
||||||
|
| 월세 신고 | 부동산 세금 (2) | ✅ 맞음 |
|
||||||
|
| 자녀 증여세 | 가족자산·증여 (5) | ✅ 맞음 |
|
||||||
|
| 사업자 기장 | 사업자 세무 (1) | ✅ 맞음 |
|
||||||
|
| 부가세 신고 | 부가가치세 (4) | ✅ 맞음 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6️⃣ 정확한 세법 인용 누락 ❌
|
||||||
|
|
||||||
|
**과거 오류**: 일부 포스트에서 법조 명시 부족
|
||||||
|
|
||||||
|
**문제점**:
|
||||||
|
- 정확성 원칙 위반
|
||||||
|
- 법적 책임 불명확
|
||||||
|
- 고객 신뢰도 저하
|
||||||
|
|
||||||
|
**예방책**:
|
||||||
|
- ✅ **모든 주요 내용에 세법 조항 인용 필수**
|
||||||
|
- ✅ **형식**: "소득세법 제XX조에 따르면"
|
||||||
|
- ✅ **연도 기준 명시**: "2025년 기준"
|
||||||
|
- ✅ **포스트 끝에 "법적 근거" 섹션 필수**:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
**법적 근거**:
|
||||||
|
- 소득세법 제29조 (수입금액의 계산)
|
||||||
|
- 국세기본법 제47조 (가산세)
|
||||||
|
- 소득세법 제160조 (증빙 보관)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 포스트 최종 체크리스트
|
||||||
|
|
||||||
|
모든 포스트를 DB에 등록하기 전에 다음을 확인하세요:
|
||||||
|
|
||||||
|
- [ ] **카테고리 할당**: `category_id NOT NULL` (필수)
|
||||||
|
- [ ] **내용 길이**: `LENGTH(content) >= 1500` (최소 1,500자)
|
||||||
|
- [ ] **테이블 확인**: `| |` 패턴 없음 (리스트만)
|
||||||
|
- [ ] **계산 예시**: Step 1️⃣~4️⃣ 포함 (절세액 수치)
|
||||||
|
- [ ] **세법 인용**: 모든 주요 내용에 법조 명시
|
||||||
|
- [ ] **카테고리 일치**: 포스트 주제 ↔ 카테고리 일관성
|
||||||
|
- [ ] **3단계 구조**: 1️⃣ 기초 → 2️⃣ 현실 → 3️⃣ 해결책
|
||||||
|
- [ ] **광고 규칙**: 금지 표현(보장, 최저가, 무료) 없음
|
||||||
|
- [ ] **사례 포함**: 실제 상황 + 이름/나이/직업 구체화
|
||||||
|
- [ ] **정확성**: 추측/예상/의견 표현 없음
|
||||||
|
|
||||||
|
**체크 쿼리**:
|
||||||
|
```sql
|
||||||
|
-- DB 적용 후 확인
|
||||||
|
SELECT id, title, LENGTH(content), category_id
|
||||||
|
FROM blog_posts
|
||||||
|
WHERE LENGTH(content) < 1500 OR category_id IS NULL
|
||||||
|
ORDER BY id;
|
||||||
|
-- 결과 없음이 정상!
|
||||||
|
```
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
| 3.3 | [주요 Python 패키지](#33-주요-python-패키지-시스템) | 시스템/venv 패키지 구분 |
|
| 3.3 | [주요 Python 패키지](#33-주요-python-패키지-시스템) | 시스템/venv 패키지 구분 |
|
||||||
| 4 | [서비스 아키텍처](#4-서비스-아키텍처) | 포트 맵, Nginx 리버스 프록시 |
|
| 4 | [서비스 아키텍처](#4-서비스-아키텍처) | 포트 맵, Nginx 리버스 프록시 |
|
||||||
| 4.1 | [포트 맵](#41-포트-맵) | 22, 80, 2222, 3000, 5000, 5432 |
|
| 4.1 | [포트 맵](#41-포트-맵) | 22, 80, 2222, 3000, 5000, 5432 |
|
||||||
| 4.2 | [Nginx 리버스 프록시](#42-nginx-리버스-프록시) | `/` → Gitea, `/quant/` → Blazor |
|
| 4.2 | [Nginx 리버스 프록시](#42-nginx-리버스-프록시) | 도메인 기반 가상 호스트 분기 (홈페이지, Gitea, Quant) |
|
||||||
| 5 | [Gitea](#5-gitea) | Docker Compose 설정, 시크릿, 데이터 경로 |
|
| 5 | [Gitea](#5-gitea) | Docker Compose 설정, 시크릿, 데이터 경로 |
|
||||||
| 5.1 | [Docker Compose](#51-docker-compose) | `gitea:1.26.4`, PG 연동 |
|
| 5.1 | [Docker Compose](#51-docker-compose) | `gitea:1.26.4`, PG 연동 |
|
||||||
| 5.2 | [시크릿 관리](#52-시크릿-관리) | `/opt/stacks/gitea/.env` |
|
| 5.2 | [시크릿 관리](#52-시크릿-관리) | `/opt/stacks/gitea/.env` |
|
||||||
@@ -126,17 +126,22 @@ boto3, cryptography, Jinja2, jsonschema, fail2ban 등 시스템 레벨로 설치
|
|||||||
### 4.2. Nginx 리버스 프록시
|
### 4.2. Nginx 리버스 프록시
|
||||||
|
|
||||||
```nginx
|
```nginx
|
||||||
# /etc/nginx/sites-enabled/gitea-ip.conf
|
# /etc/nginx/sites-available/taxbaik-domains.conf
|
||||||
|
|
||||||
|
# 1. TaxBaik 홈페이지 (taxbaik.com, www.taxbaik.com)
|
||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
server_name taxbaik.com www.taxbaik.com;
|
||||||
listen [::]:80 default_server;
|
|
||||||
server_name _;
|
|
||||||
client_max_body_size 512M;
|
client_max_body_size 512M;
|
||||||
|
|
||||||
# QuantEngine Blazor Web App
|
|
||||||
location /quant/ {
|
# /admin 하위 요청을 /taxbaik/admin 으로 리다이렉트하여 Blazor Base Path 대응
|
||||||
proxy_pass http://127.0.0.1:5000/;
|
location /admin {
|
||||||
|
return 301 $scheme://$host/taxbaik$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 루트 경로 요청을 /taxbaik 으로 프록싱하여 base href /taxbaik/ 에 대응
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:5001/taxbaik/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "Upgrade";
|
proxy_set_header Connection "Upgrade";
|
||||||
@@ -147,7 +152,33 @@ server {
|
|||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Gitea (기본)
|
# /taxbaik/ 하위로 들어오는 리소스 및 페이지 요청 처리
|
||||||
|
location /taxbaik {
|
||||||
|
proxy_pass http://127.0.0.1:5001;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_read_timeout 120s;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2. Gitea (gitea.taxbaik.com)
|
||||||
|
server {
|
||||||
|
server_name gitea.taxbaik.com;
|
||||||
|
client_max_body_size 512M;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://127.0.0.1:3000;
|
proxy_pass http://127.0.0.1:3000;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
@@ -159,13 +190,89 @@ server {
|
|||||||
proxy_connect_timeout 300;
|
proxy_connect_timeout 300;
|
||||||
proxy_send_timeout 300;
|
proxy_send_timeout 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 3. QuantEngine (quant.taxbaik.com)
|
||||||
|
server {
|
||||||
|
server_name quant.taxbaik.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:5000/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen 443 ssl; # managed by Certbot
|
||||||
|
ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; # managed by Certbot
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; # managed by Certbot
|
||||||
|
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||||
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
if ($host = www.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
if ($host = taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name taxbaik.com www.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
if ($host = gitea.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name gitea.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
if ($host = quant.taxbaik.com) {
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
} # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
|
listen 80;
|
||||||
|
server_name quant.taxbaik.com;
|
||||||
|
return 404; # managed by Certbot
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**라우팅 요약**:
|
**라우팅 요약**:
|
||||||
- `http://178.104.200.7/` → Gitea Web UI
|
- `http://taxbaik.com/` 또는 `http://www.taxbaik.com/` → TaxBaik 홈페이지 (내부 proxy: `http://127.0.0.1:5001/taxbaik/`)
|
||||||
- `http://178.104.200.7/quant/` → QuantEngine Blazor Admin
|
- `http://gitea.taxbaik.com/` → Gitea Web UI (내부 proxy: `http://127.0.0.1:3000`)
|
||||||
- `ssh://178.104.200.7:2222` → Gitea Git SSH
|
- `http://quant.taxbaik.com/` → QuantEngine Blazor Admin (내부 proxy: `http://127.0.0.1:5000/`)
|
||||||
|
- `ssh://gitea.taxbaik.com:2222` → Gitea Git SSH
|
||||||
|
|
||||||
## 5. Gitea
|
## 5. Gitea
|
||||||
|
|
||||||
@@ -384,7 +491,7 @@ ClientAliveCountMax 2
|
|||||||
| **CI Runner** | Synology Act Runner | 6× `act_runner:latest` (Docker) |
|
| **CI Runner** | Synology Act Runner | 6× `act_runner:latest` (Docker) |
|
||||||
| **DB** | SQLite (파일 기반) | PostgreSQL 18 + SQLite (하이브리드) |
|
| **DB** | SQLite (파일 기반) | PostgreSQL 18 + SQLite (하이브리드) |
|
||||||
| **웹 Admin** | 없음 | QuantEngine Blazor (.NET 10, MudBlazor) |
|
| **웹 Admin** | 없음 | QuantEngine Blazor (.NET 10, MudBlazor) |
|
||||||
| **리버스 프록시** | Synology 내장 | Nginx (`/` → Gitea, `/quant/` → Blazor) |
|
| **리버스 프록시** | Synology 내장 | Nginx (도메인 기반 분기 - 홈페이지, Gitea, Quant) |
|
||||||
| **보안** | DSM 방화벽 | fail2ban + SSH 공개키 + 서비스 로컬바인드 |
|
| **보안** | DSM 방화벽 | fail2ban + SSH 공개키 + 서비스 로컬바인드 |
|
||||||
| **시크릿 관리** | `.secrets/kis_real.env` | `/opt/stacks/gitea/.env` |
|
| **시크릿 관리** | `.secrets/kis_real.env` | `/opt/stacks/gitea/.env` |
|
||||||
| **OS** | Synology DSM 7.x | Ubuntu 26.04 LTS |
|
| **OS** | Synology DSM 7.x | Ubuntu 26.04 LTS |
|
||||||
@@ -19,32 +19,46 @@ GRANT ALL PRIVILEGES ON DATABASE taxbaikdb TO taxbaik;
|
|||||||
|
|
||||||
### 2. 환경 변수 설정
|
### 2. 환경 변수 설정
|
||||||
|
|
||||||
**Web 서비스** (`/etc/systemd/system/taxbaik.service`):
|
**Web 서비스** (`/etc/systemd/system/taxbaik.service`, 백엔드 전용):
|
||||||
```ini
|
```ini
|
||||||
[Service]
|
[Service]
|
||||||
Environment=ASPNETCORE_ENVIRONMENT=Production
|
Environment=ASPNETCORE_ENVIRONMENT=Production
|
||||||
Environment=ASPNETCORE_URLS=http://127.0.0.1:5001
|
Environment=ASPNETCORE_URLS=http://127.0.0.1:5004
|
||||||
Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=your_secure_password
|
Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=your_secure_password
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**프록시 서비스** (`/etc/systemd/system/taxbaik-proxy.service`, 5001 진입점):
|
||||||
|
```ini
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/bin/dotnet TaxBaik.Proxy.dll
|
||||||
|
WorkingDirectory=/home/kjh2064/taxbaik_active
|
||||||
|
Restart=always
|
||||||
|
```
|
||||||
|
|
||||||
### 3. systemd 서비스 파일 설치
|
### 3. systemd 서비스 파일 설치
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo cp deploy/taxbaik.service /etc/systemd/system/
|
sudo cp deploy/taxbaik.service /etc/systemd/system/
|
||||||
|
sudo cp deploy/taxbaik-proxy.service /etc/systemd/system/
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl enable taxbaik
|
sudo systemctl enable taxbaik
|
||||||
|
sudo systemctl enable taxbaik-proxy
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Nginx 설정
|
### 4. Nginx 설정
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 현재 Nginx 설정 확인
|
# Nginx 도메인 기반 가상 호스트 설정 복사
|
||||||
sudo cat /etc/nginx/sites-available/default | head -30
|
sudo cp deploy/nginx-taxbaik-domains.conf /etc/nginx/sites-available/taxbaik-domains.conf
|
||||||
|
|
||||||
# location 블록 추가 (또는 기존 설정에 병합)
|
# 기존 설정(IP 기반 및 default) 활성화 해제
|
||||||
sudo cp deploy/nginx-taxbaik-locations.conf /etc/nginx/conf.d/taxbaik.conf
|
sudo rm -f /etc/nginx/sites-enabled/default
|
||||||
|
sudo rm -f /etc/nginx/sites-enabled/gitea-ip.conf
|
||||||
|
|
||||||
# 테스트 및 재로드
|
# 새 설정 활성화 (심링크 생성)
|
||||||
|
sudo ln -sfn /etc/nginx/sites-available/taxbaik-domains.conf /etc/nginx/sites-enabled/taxbaik-domains.conf
|
||||||
|
|
||||||
|
# 설정 문법 테스트 및 Nginx 서비스 리로드
|
||||||
sudo nginx -t
|
sudo nginx -t
|
||||||
sudo systemctl reload nginx
|
sudo systemctl reload nginx
|
||||||
```
|
```
|
||||||
@@ -65,7 +79,7 @@ sudo systemctl reload nginx
|
|||||||
master 브랜치 push → build → test → publish → restart → health check → Playwright
|
master 브랜치 push → build → test → publish → restart → health check → Playwright
|
||||||
```
|
```
|
||||||
|
|
||||||
수동 배포는 비상 롤백 외에는 사용하지 않습니다. 배포 이슈는 Gitea Actions 로그로 해결합니다.
|
수동 배포는 사용하지 않습니다. `deploy_gb.sh`는 `TAXBAIK_DEPLOY_FROM_CI=1`이 없으면 즉시 종료하므로, 배포는 반드시 Gitea Actions에서만 실행됩니다.
|
||||||
|
|
||||||
## 마이그레이션 자동 실행
|
## 마이그레이션 자동 실행
|
||||||
|
|
||||||
@@ -128,6 +142,7 @@ ls -la ~/deployments/ | grep taxbaik
|
|||||||
|
|
||||||
# 심링크 변경 (예: 이전 버전이 taxbaik_20260626_140000)
|
# 심링크 변경 (예: 이전 버전이 taxbaik_20260626_140000)
|
||||||
ln -sfn ~/deployments/taxbaik_20260626_140000 ~/taxbaik_active
|
ln -sfn ~/deployments/taxbaik_20260626_140000 ~/taxbaik_active
|
||||||
|
sudo systemctl restart taxbaik-proxy
|
||||||
sudo systemctl restart taxbaik
|
sudo systemctl restart taxbaik
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -139,10 +154,10 @@ sudo systemctl restart taxbaik
|
|||||||
ssh kjh2064@178.104.200.7
|
ssh kjh2064@178.104.200.7
|
||||||
|
|
||||||
# 서비스 상태
|
# 서비스 상태
|
||||||
systemctl status taxbaik
|
systemctl status taxbaik taxbaik-proxy
|
||||||
|
|
||||||
# 포트 확인
|
# 포트 확인
|
||||||
netstat -tlnp | grep -E '5001'
|
netstat -tlnp | grep -E '5001|5004'
|
||||||
|
|
||||||
# 프로세스 확인
|
# 프로세스 확인
|
||||||
ps aux | grep TaxBaik
|
ps aux | grep TaxBaik
|
||||||
@@ -165,9 +180,27 @@ journalctl -u taxbaik -f
|
|||||||
| 404 /taxbaik | Nginx 설정 미적용 | `sudo nginx -t && sudo systemctl reload nginx` |
|
| 404 /taxbaik | Nginx 설정 미적용 | `sudo nginx -t && sudo systemctl reload nginx` |
|
||||||
| Blazor WebSocket 안 됨 | `/taxbaik` location에 `proxy_http_version 1.1`, `Upgrade`, `Connection \"Upgrade\"` 헤더가 모두 있는지 확인 |
|
| Blazor WebSocket 안 됨 | `/taxbaik` location에 `proxy_http_version 1.1`, `Upgrade`, `Connection \"Upgrade\"` 헤더가 모두 있는지 확인 |
|
||||||
| DB 연결 오류 | 환경 변수 미설정 | systemd service 파일의 ConnectionStrings__Default 확인 |
|
| DB 연결 오류 | 환경 변수 미설정 | systemd service 파일의 ConnectionStrings__Default 확인 |
|
||||||
| 503 Service Unavailable | 앱 미시작 | `sudo systemctl restart taxbaik` |
|
| 503 Service Unavailable | 백엔드 또는 프록시 미시작 | `sudo systemctl restart taxbaik-proxy taxbaik` |
|
||||||
| 마이그레이션 실패 | DB 권한 문제 | `GRANT ALL PRIVILEGES ON DATABASE taxbaikdb TO taxbaik;` |
|
| 마이그레이션 실패 | DB 권한 문제 | `GRANT ALL PRIVILEGES ON DATABASE taxbaikdb TO taxbaik;` |
|
||||||
|
|
||||||
|
## 운영 복구 순서
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh kjh2064@178.104.200.7
|
||||||
|
sudo cp /home/kjh2064/taxbaik.service /etc/systemd/system/taxbaik.service
|
||||||
|
sudo cp /home/kjh2064/taxbaik-proxy.service /etc/systemd/system/taxbaik-proxy.service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl restart taxbaik-proxy
|
||||||
|
sudo systemctl restart taxbaik
|
||||||
|
curl -I http://127.0.0.1:5001/taxbaik/admin/login
|
||||||
|
```
|
||||||
|
|
||||||
|
## 원라인 점검
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh kjh2064@178.104.200.7 'systemctl status taxbaik taxbaik-proxy --no-pager --lines=3 && ss -tlnp | grep -E ":5001 |:5004 " && curl -fsSI http://127.0.0.1:5001/taxbaik/admin/login && curl -fsS http://127.0.0.1:5001/taxbaik/favicon.svg >/dev/null && curl -fsS http://127.0.0.1:5001/taxbaik/robots.txt >/dev/null'
|
||||||
|
```
|
||||||
|
|
||||||
## 초기 데이터
|
## 초기 데이터
|
||||||
|
|
||||||
### 관리자 계정
|
### 관리자 계정
|
||||||
@@ -48,29 +48,7 @@ ssh kjh2064@178.104.200.7 'bash ~/SERVER_SETUP.sh'
|
|||||||
# ~/taxbaik_active
|
# ~/taxbaik_active
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2단계: 첫 배포 (수동)
|
### 2단계: Gitea Actions 설정
|
||||||
|
|
||||||
```bash
|
|
||||||
# 로컬에서 실행
|
|
||||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
||||||
|
|
||||||
# SSH 키 설정 (필요시)
|
|
||||||
export DEPLOY_USER="kjh2064"
|
|
||||||
export DEPLOY_HOST="178.104.200.7"
|
|
||||||
|
|
||||||
# 배포
|
|
||||||
rsync -avz --delete ./publish/ \
|
|
||||||
$DEPLOY_USER@$DEPLOY_HOST:~/deployments/taxbaik_${TIMESTAMP}/
|
|
||||||
|
|
||||||
# 심링크 변경 및 시작
|
|
||||||
ssh $DEPLOY_USER@$DEPLOY_HOST << EOF
|
|
||||||
ln -sfn ~/deployments/taxbaik_${TIMESTAMP} ~/taxbaik_active
|
|
||||||
sudo systemctl start taxbaik
|
|
||||||
sudo systemctl status taxbaik
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3단계: Gitea Actions 설정 (선택)
|
|
||||||
|
|
||||||
**Gitea 저장소 Settings → Secrets 추가**:
|
**Gitea 저장소 Settings → Secrets 추가**:
|
||||||
- `DEPLOY_USER`: `kjh2064`
|
- `DEPLOY_USER`: `kjh2064`
|
||||||
@@ -217,8 +195,8 @@ curl -I -H "Accept-Encoding: gzip" http://178.104.200.7/taxbaik/ | grep -i encod
|
|||||||
| 증상 | 원인 | 해결 방법 |
|
| 증상 | 원인 | 해결 방법 |
|
||||||
|------|------|----------|
|
|------|------|----------|
|
||||||
| 404 /taxbaik | Nginx 설정 미적용 | `sudo nginx -t && sudo systemctl reload nginx` |
|
| 404 /taxbaik | Nginx 설정 미적용 | `sudo nginx -t && sudo systemctl reload nginx` |
|
||||||
| 502 Bad Gateway | 앱 미실행 | `sudo systemctl restart taxbaik` |
|
| 502 Bad Gateway | 프록시 또는 백엔드 미실행 | `sudo systemctl restart taxbaik-proxy taxbaik` |
|
||||||
| 503 Service Unavailable | 앱 충돌 | 로그 확인: `journalctl -u taxbaik -n 50` |
|
| 503 Service Unavailable | 백엔드 충돌 또는 비밀값 누락 | 로그 확인: `journalctl -u taxbaik -n 50` |
|
||||||
| DB 연결 오류 | 환경 변수 미설정 | systemd 파일의 ConnectionStrings__Default 확인 |
|
| DB 연결 오류 | 환경 변수 미설정 | systemd 파일의 ConnectionStrings__Default 확인 |
|
||||||
| HTTPS 오류 | SSL 미구성 | 개발 환경에서는 HTTP 사용 (IP 기반) |
|
| HTTPS 오류 | SSL 미구성 | 개발 환경에서는 HTTP 사용 (IP 기반) |
|
||||||
| 마이그레이션 실패 | 테이블 존재 | `DROP DATABASE taxbaikdb;` 후 재시작 |
|
| 마이그레이션 실패 | 테이블 존재 | `DROP DATABASE taxbaikdb;` 후 재시작 |
|
||||||
@@ -230,11 +208,11 @@ curl -I -H "Accept-Encoding: gzip" http://178.104.200.7/taxbaik/ | grep -i encod
|
|||||||
### 실시간 모니터링
|
### 실시간 모니터링
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 터미널 1: 웹 서비스 로그
|
# 터미널 1: 백엔드 로그
|
||||||
ssh kjh2064@178.104.200.7 'journalctl -u taxbaik -f'
|
ssh kjh2064@178.104.200.7 'journalctl -u taxbaik -f'
|
||||||
|
|
||||||
# 터미널 2: 통합 서비스 로그
|
# 터미널 2: 프록시 로그
|
||||||
ssh kjh2064@178.104.200.7 'journalctl -u taxbaik -f'
|
ssh kjh2064@178.104.200.7 'journalctl -u taxbaik-proxy -f'
|
||||||
|
|
||||||
# 터미널 3: Nginx 로그
|
# 터미널 3: Nginx 로그
|
||||||
ssh kjh2064@178.104.200.7 'sudo tail -f /var/log/nginx/access.log | grep taxbaik'
|
ssh kjh2064@178.104.200.7 'sudo tail -f /var/log/nginx/access.log | grep taxbaik'
|
||||||
@@ -246,13 +224,7 @@ ssh kjh2064@178.104.200.7 'watch -n 1 "ps aux | grep TaxBaik"'
|
|||||||
### 정기적 검사
|
### 정기적 검사
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 일일 체크 (cron job)
|
# 일일 체크는 CI 배포 후 자동 검증으로 대체
|
||||||
0 9 * * * /home/kjh2064/health-check.sh
|
|
||||||
|
|
||||||
# 내용:
|
|
||||||
#!/bin/bash
|
|
||||||
curl -f http://127.0.0.1:5001/taxbaik || systemctl restart taxbaik
|
|
||||||
curl -f http://127.0.0.1:5001/taxbaik/admin/login || systemctl restart taxbaik
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -268,11 +240,6 @@ git commit -m "기능: 새로운 기능 추가"
|
|||||||
git push origin master
|
git push origin master
|
||||||
|
|
||||||
# 2. Gitea Actions가 자동으로 배포
|
# 2. Gitea Actions가 자동으로 배포
|
||||||
# 또는 수동 배포:
|
|
||||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
||||||
dotnet publish TaxBaik.Web -c Release -o ./publish
|
|
||||||
rsync -avz ./publish/ kjh2064@178.104.200.7:~/deployments/taxbaik_${TIMESTAMP}/
|
|
||||||
ssh kjh2064@178.104.200.7 "ln -sfn ~/deployments/taxbaik_${TIMESTAMP} ~/taxbaik_active && sudo systemctl restart taxbaik"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 롤백 절차
|
### 롤백 절차
|
||||||
@@ -284,6 +251,7 @@ ssh kjh2064@178.104.200.7 'ls -la ~/deployments/ | grep taxbaik'
|
|||||||
# 롤백 (예: 이전 버전이 taxbaik_20260625_100000)
|
# 롤백 (예: 이전 버전이 taxbaik_20260625_100000)
|
||||||
ssh kjh2064@178.104.200.7 << EOF
|
ssh kjh2064@178.104.200.7 << EOF
|
||||||
ln -sfn ~/deployments/taxbaik_20260625_100000 ~/taxbaik_active
|
ln -sfn ~/deployments/taxbaik_20260625_100000 ~/taxbaik_active
|
||||||
|
sudo systemctl restart taxbaik-proxy
|
||||||
sudo systemctl restart taxbaik
|
sudo systemctl restart taxbaik
|
||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
@@ -522,3 +522,46 @@ Todo:
|
|||||||
- WBS-UX-03/04 구현 완료
|
- WBS-UX-03/04 구현 완료
|
||||||
- WBS-CRM-01/02/03/04/05 구현 완료 (배포 후 검증 필요)
|
- WBS-CRM-01/02/03/04/05 구현 완료 (배포 후 검증 필요)
|
||||||
- WBS-CRM-06/07/08 (텔레그램·포털·소셜 로그인) Phase 3 미착수
|
- WBS-CRM-06/07/08 (텔레그램·포털·소셜 로그인) Phase 3 미착수
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ── 홈페이지 · 어드민 · 포털 프리미엄 UX/UI 개편 (2026-06-30) ──────────────────
|
||||||
|
|
||||||
|
## WBS-UX-05 홈페이지 프리미엄 UI 및 마이크로 인터랙션
|
||||||
|
|
||||||
|
목표: 홈페이지 디자인을 극도로 모던하고 신뢰성 있는 프리미엄 스타일로 전면 개편한다.
|
||||||
|
|
||||||
|
성공 기준:
|
||||||
|
- Hero 섹션에 유려한 배경 그라데이션 및 부드러운 CSS 애니메이션 효과 적용
|
||||||
|
- 서비스 카드에 섀도우 및 보더 트랜지션, 골드/그린 그라데이션 호버 이펙트 추가
|
||||||
|
- 신뢰도 스트립 카드에 입체감 및 돋보이는 레이아웃 설계
|
||||||
|
- Noto Sans KR 외에 Outfit/Inter 등의 보조 영문 폰트 결합으로 타이포그래피 고급화
|
||||||
|
|
||||||
|
Todo:
|
||||||
|
- [x] `site.css` 내 Hero 섹션 그라데이션 및 CSS 애니메이션 보강
|
||||||
|
- [x] 서비스 카드 및 신뢰도 스트립 컴포넌트 프리미엄 스타일로 개편
|
||||||
|
- [x] 홈페이지 폰트 스택 확장 및 메인 레이아웃 적용
|
||||||
|
|
||||||
|
## WBS-PORTAL-01 고객 포털 UI/UX 고도화 및 글래스모피즘
|
||||||
|
|
||||||
|
목표: 고객 마이 포털 화면을 미려하고 현대적인 글래스모피즘 디자인으로 개편하여 이용 가치를 극대화한다.
|
||||||
|
|
||||||
|
성공 기준:
|
||||||
|
- 포털 메인 대시보드 카드를 Glassmorphism 스타일(blur, semi-transparent border)로 변경
|
||||||
|
- 세무 신고 현황 테이블 및 상담 이력 타임라인 컴포넌트의 모던 디자인화
|
||||||
|
|
||||||
|
Todo:
|
||||||
|
- [x] `site.css` 내 포털 전용 모던 글래스모피즘 클래스군 추가
|
||||||
|
- [x] `Portal/Index.cshtml` 레이아웃 및 컴포넌트 UI 고도화
|
||||||
|
|
||||||
|
## WBS-MAINT-02 코드 품질 및 경고 결함 차단
|
||||||
|
|
||||||
|
목표: 빌드 컴파일 타임 경고(Warnings)를 0으로 유지하여 미래 코드 결함을 방지한다.
|
||||||
|
|
||||||
|
성공 기준:
|
||||||
|
- `dotnet build` 수행 시 경고 0개 달성
|
||||||
|
|
||||||
|
Todo:
|
||||||
|
- [x] `CustomAuthenticationStateProvider.cs` Nullable 경고 수정
|
||||||
|
- [x] `Dashboard.razor` 미사용 변수 제거 및 UI 연계 바인딩 처리
|
||||||
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
-- Common code audit checks
|
||||||
|
SELECT code_group, code_value
|
||||||
|
FROM common_codes
|
||||||
|
WHERE code_group LIKE '% %';
|
||||||
|
|
||||||
|
SELECT code_group, code_value
|
||||||
|
FROM common_codes
|
||||||
|
WHERE code_value LIKE '% %';
|
||||||
|
|
||||||
|
SELECT code_group, code_value, LEN(code_group) AS code_group_len, LEN(code_value) AS code_value_len
|
||||||
|
FROM common_codes
|
||||||
|
WHERE LEN(code_group) > 80
|
||||||
|
OR LEN(code_value) > 120
|
||||||
|
OR LEN(code_name) > 200;
|
||||||
|
|
||||||
|
SELECT code_group, COUNT(*)
|
||||||
|
FROM common_codes
|
||||||
|
GROUP BY code_group
|
||||||
|
ORDER BY code_group;
|
||||||
|
|
||||||
|
SELECT DISTINCT c.service_type
|
||||||
|
FROM clients c
|
||||||
|
LEFT JOIN common_codes cc
|
||||||
|
ON cc.code_group = 'CLIENT_SERVICE_TYPE'
|
||||||
|
AND cc.code_value = c.service_type
|
||||||
|
WHERE c.service_type IS NOT NULL
|
||||||
|
AND cc.code_value IS NULL;
|
||||||
|
|
||||||
|
SELECT c.status, COUNT(*) AS cnt
|
||||||
|
FROM clients c
|
||||||
|
LEFT JOIN common_codes cc
|
||||||
|
ON cc.code_group = 'CLIENT_STATUS'
|
||||||
|
AND cc.code_value = c.status
|
||||||
|
WHERE c.status IS NOT NULL
|
||||||
|
AND cc.code_value IS NULL
|
||||||
|
GROUP BY c.status;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- Restore archived blog posts that were hidden by soft delete.
|
||||||
|
-- Use only when the goal is to bring back previously archived posts.
|
||||||
|
|
||||||
|
UPDATE blog_posts
|
||||||
|
SET deleted_at = NULL,
|
||||||
|
updated_at = NOW()
|
||||||
|
WHERE deleted_at IS NOT NULL;
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
import { chromium } from '@playwright/test';
|
|
||||||
|
|
||||||
const browser = await chromium.launch();
|
|
||||||
const page = await browser.newPage();
|
|
||||||
|
|
||||||
try {
|
|
||||||
console.log('🧪 최종 테스트: Settings 페이지 로딩 인디케이터');
|
|
||||||
console.log('');
|
|
||||||
|
|
||||||
// 로그인
|
|
||||||
await page.goto('http://178.104.200.7/taxbaik/admin/login', { waitUntil: 'networkidle' });
|
|
||||||
await page.fill('input[placeholder="사용자명"]', 'test_admin');
|
|
||||||
await page.fill('input[placeholder="비밀번호"]', 'TestAdmin@123456');
|
|
||||||
await page.click('button:has-text("로그인")');
|
|
||||||
await page.waitForURL(/\/taxbaik\/admin\/dashboard$/);
|
|
||||||
console.log('✅ 로그인 성공');
|
|
||||||
|
|
||||||
// Settings 페이지로 이동
|
|
||||||
console.log('📍 Settings 페이지로 이동...');
|
|
||||||
await page.goto('http://178.104.200.7/taxbaik/admin/settings', { waitUntil: 'domcontentloaded' });
|
|
||||||
|
|
||||||
// 로딩 인디케이터 상태 확인
|
|
||||||
console.log('');
|
|
||||||
console.log('⏱️ 로딩 상태 모니터링:');
|
|
||||||
|
|
||||||
for (let i = 1; i <= 5; i++) {
|
|
||||||
await page.waitForTimeout(500);
|
|
||||||
|
|
||||||
const loadingVisible = await page.locator('#blazor-loading.show').isVisible().catch(() => false);
|
|
||||||
const mudCount = await page.locator('[class*="mud-"]').count();
|
|
||||||
const formElements = await page.locator('input, .admin-section-header').count();
|
|
||||||
|
|
||||||
console.log(` ${i}초: Loading=${loadingVisible ? '보임' : '안보임'}, Mud=${mudCount}, Form=${formElements}`);
|
|
||||||
|
|
||||||
if (!loadingVisible && mudCount > 20) {
|
|
||||||
console.log('');
|
|
||||||
console.log('✅ 로딩 인디케이터 정상 작동!');
|
|
||||||
console.log(' → 페이지 로드 중: 스피너 표시');
|
|
||||||
console.log(' → 페이지 완료: 스피너 숨김');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 스크린샷
|
|
||||||
await page.screenshot({ path: 'settings-final.png' });
|
|
||||||
console.log('✅ 스크린샷 저장: settings-final.png');
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ 오류:', error.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
await browser.close();
|
|
||||||
-304
@@ -1,304 +0,0 @@
|
|||||||
2026-06-27T04:56:03.3351427Z hz-prod-runner-2(version:v0.6.1) received task 226 of job build-and-deploy, be triggered by event: push
|
|
||||||
2026-06-27T04:56:03.3365627Z workflow prepared
|
|
||||||
2026-06-27T04:56:03.3368227Z evaluating expression 'success()'
|
|
||||||
2026-06-27T04:56:03.3369635Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T04:56:03.3369906Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T04:56:03.3469982Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T04:56:03.3470151Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T04:56:03.3711275Z Image exists? true
|
|
||||||
2026-06-27T04:56:03.4320683Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T04:56:03.5768660Z Created container name=GITEA-ACTIONS-TASK-226-WORKFLOW-TaxBaik-CI-CD-JOB-build-and-dep-a3bcec03683b8288cca5dbdce5fc0bc04f6c8040c52843997ac5d043bef6c2cd id=d2fef580855a7a9e6623f1d2d4854e6d6df506657a8ccbc0d74d5244696c7287 from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T04:56:03.5769226Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T04:56:03.5769370Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T04:56:03.5769500Z Starting container: d2fef580855a7a9e6623f1d2d4854e6d6df506657a8ccbc0d74d5244696c7287
|
|
||||||
2026-06-27T04:56:03.7251219Z Started container: d2fef580855a7a9e6623f1d2d4854e6d6df506657a8ccbc0d74d5244696c7287
|
|
||||||
2026-06-27T04:56:03.8326400Z Writing entry to tarball workflow/event.json len:4689
|
|
||||||
2026-06-27T04:56:03.8326926Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T04:56:03.8327356Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T04:56:03.8540089Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T04:56:03.8540403Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T04:56:04.3610152Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T04:56:04.3610725Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T04:56:04.3705653Z Checked out v4
|
|
||||||
2026-06-27T04:56:04.3831658Z ☁ git clone 'https://github.com/actions/setup-dotnet' # ref=v4
|
|
||||||
2026-06-27T04:56:04.3832406Z cloning https://github.com/actions/setup-dotnet to /root/.cache/act/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336
|
|
||||||
2026-06-27T04:56:05.0081404Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T04:56:05.0081931Z Cloned https://github.com/actions/setup-dotnet to /root/.cache/act/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336
|
|
||||||
2026-06-27T04:56:05.0309400Z Checked out v4
|
|
||||||
2026-06-27T04:56:05.0581711Z evaluating expression ''
|
|
||||||
2026-06-27T04:56:05.0582187Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T04:56:05.0582308Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T04:56:05.0582506Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T04:56:05.0582655Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T04:56:05.0582768Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T04:56:05.0582888Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T04:56:05.0582972Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T04:56:05.0583056Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T04:56:05.0634156Z ::group::Run Checkout code
|
|
||||||
2026-06-27T04:56:05.6257781Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T04:56:05.6257964Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T04:56:05.6258420Z ::group::Getting Git version info
|
|
||||||
2026-06-27T04:56:05.6258529Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T04:56:05.6259126Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T04:56:05.6313546Z git version 2.54.0
|
|
||||||
2026-06-27T04:56:05.6364469Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.6371338Z Temporarily overriding HOME='/tmp/3e93f553-efe9-4f68-aa0d-91861f1d766a' before making global git config changes
|
|
||||||
2026-06-27T04:56:05.6389308Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T04:56:05.6389710Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T04:56:05.6428064Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T04:56:05.6433245Z ::group::Initializing the repository
|
|
||||||
2026-06-27T04:56:05.6445696Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T04:56:05.6543767Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T04:56:05.6544631Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T04:56:05.6545055Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T04:56:05.6545168Z hint: call:
|
|
||||||
2026-06-27T04:56:05.6545317Z hint:
|
|
||||||
2026-06-27T04:56:05.6545401Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T04:56:05.6545683Z hint:
|
|
||||||
2026-06-27T04:56:05.6545823Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T04:56:05.6545970Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T04:56:05.6546470Z hint:
|
|
||||||
2026-06-27T04:56:05.6546651Z hint: git branch -m <name>
|
|
||||||
2026-06-27T04:56:05.6546773Z hint:
|
|
||||||
2026-06-27T04:56:05.6546843Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T04:56:05.6554341Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T04:56:05.6575873Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T04:56:05.6623404Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.6626429Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T04:56:05.6634254Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T04:56:05.6685641Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.6687849Z ::group::Setting up auth
|
|
||||||
2026-06-27T04:56:05.6698455Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T04:56:05.6740219Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T04:56:05.7248040Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T04:56:05.7288824Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T04:56:05.7658992Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T04:56:05.7659732Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T04:56:05.7968273Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T04:56:05.8012871Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.8015731Z ::group::Fetching the repository
|
|
||||||
2026-06-27T04:56:05.8027365Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +113140e6850a661075c8f50d672a5dd6915aeab5:refs/remotes/origin/master
|
|
||||||
2026-06-27T04:56:05.9415617Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T04:56:05.9416228Z * [new ref] 113140e6850a661075c8f50d672a5dd6915aeab5 -> origin/master
|
|
||||||
2026-06-27T04:56:05.9476858Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.9479051Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T04:56:05.9483545Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.9491587Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T04:56:05.9567970Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T04:56:05.9615301Z ::group::Checking out the ref
|
|
||||||
2026-06-27T04:56:05.9615447Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T04:56:05.9746041Z Reset branch 'master'
|
|
||||||
2026-06-27T04:56:05.9746789Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T04:56:05.9764086Z ::endgroup::
|
|
||||||
2026-06-27T04:56:05.9887328Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T04:56:05.9887474Z 113140e6850a661075c8f50d672a5dd6915aeab5
|
|
||||||
2026-06-27T04:56:05.9890246Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T04:56:05.9973072Z ::endgroup::
|
|
||||||
2026-06-27T04:56:06.0501470Z ::group::Run Setup .NET
|
|
||||||
2026-06-27T04:56:06.0501794Z with:
|
|
||||||
2026-06-27T04:56:06.0501904Z dotnet-version: 10.0
|
|
||||||
2026-06-27T04:56:06.5648878Z (node:143) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T04:56:06.5649560Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T04:56:06.5717881Z [command]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS
|
|
||||||
2026-06-27T04:56:07.0670653Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz
|
|
||||||
2026-06-27T04:56:07.6200922Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz size is 36606251 bytes.
|
|
||||||
2026-06-27T04:56:07.6208881Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz
|
|
||||||
2026-06-27T04:56:08.5050524Z dotnet-install: Downloaded file size is 36606251 bytes.
|
|
||||||
2026-06-27T04:56:08.5051004Z dotnet-install: The remote and local file sizes are equal.
|
|
||||||
2026-06-27T04:56:08.5294116Z dotnet-install: Installed version is 10.0.9
|
|
||||||
2026-06-27T04:56:08.5362394Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script.
|
|
||||||
2026-06-27T04:56:08.5367675Z dotnet-install: Note that the script does not resolve dependencies during installation.
|
|
||||||
2026-06-27T04:56:08.5375788Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
|
|
||||||
2026-06-27T04:56:08.5376343Z dotnet-install: Installation finished successfully.
|
|
||||||
2026-06-27T04:56:08.5413709Z [command]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/externals/install-dotnet.sh --skip-non-versioned-files --channel 10.0
|
|
||||||
2026-06-27T04:56:08.9148862Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz
|
|
||||||
2026-06-27T04:56:12.0031545Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz size is 235086718 bytes.
|
|
||||||
2026-06-27T04:56:12.0048639Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz
|
|
||||||
2026-06-27T04:56:18.1368889Z dotnet-install: Downloaded file size is 235086718 bytes.
|
|
||||||
2026-06-27T04:56:18.1369604Z dotnet-install: The remote and local file sizes are equal.
|
|
||||||
2026-06-27T04:56:18.3473775Z dotnet-install: Installed version is 10.0.301
|
|
||||||
2026-06-27T04:56:18.3528935Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script.
|
|
||||||
2026-06-27T04:56:18.3537893Z dotnet-install: Note that the script does not resolve dependencies during installation.
|
|
||||||
2026-06-27T04:56:18.3538239Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
|
|
||||||
2026-06-27T04:56:18.3538644Z dotnet-install: Installation finished successfully.
|
|
||||||
2026-06-27T04:56:18.3769412Z ##[add-matcher]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/.github/csc.json
|
|
||||||
2026-06-27T04:56:18.3907732Z ::endgroup::
|
|
||||||
2026-06-27T04:56:18.5596996Z ::group::Run dotnet restore TaxBaik.sln
|
|
||||||
2026-06-27T04:56:18.5597625Z dotnet restore TaxBaik.sln
|
|
||||||
2026-06-27T04:56:18.5597743Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:18.5597858Z ::endgroup::
|
|
||||||
2026-06-27T04:56:18.9646917Z
|
|
||||||
2026-06-27T04:56:18.9666611Z Welcome to .NET 10.0!
|
|
||||||
2026-06-27T04:56:18.9666879Z ---------------------
|
|
||||||
2026-06-27T04:56:18.9667025Z SDK Version: 10.0.301
|
|
||||||
2026-06-27T04:56:18.9667335Z
|
|
||||||
2026-06-27T04:56:18.9667460Z Telemetry
|
|
||||||
2026-06-27T04:56:18.9667540Z ---------
|
|
||||||
2026-06-27T04:56:18.9667780Z The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
|
|
||||||
2026-06-27T04:56:18.9668054Z
|
|
||||||
2026-06-27T04:56:18.9668219Z Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
|
|
||||||
2026-06-27T04:56:19.1666807Z
|
|
||||||
2026-06-27T04:56:19.1667580Z ----------------
|
|
||||||
2026-06-27T04:56:19.1668003Z Installed an ASP.NET Core HTTPS development certificate.
|
|
||||||
2026-06-27T04:56:19.1668130Z To trust the certificate, run 'dotnet dev-certs https --trust'
|
|
||||||
2026-06-27T04:56:19.1668260Z Learn about HTTPS: https://aka.ms/dotnet-https
|
|
||||||
2026-06-27T04:56:19.1668406Z
|
|
||||||
2026-06-27T04:56:19.1669837Z ----------------
|
|
||||||
2026-06-27T04:56:19.1670096Z Write your first app: https://aka.ms/dotnet-hello-world
|
|
||||||
2026-06-27T04:56:19.1670185Z Find out what's new: https://aka.ms/dotnet-whats-new
|
|
||||||
2026-06-27T04:56:19.1670261Z Explore documentation: https://aka.ms/dotnet-docs
|
|
||||||
2026-06-27T04:56:19.1670362Z Report issues and find source on GitHub: https://github.com/dotnet/core
|
|
||||||
2026-06-27T04:56:19.1670854Z Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
|
|
||||||
2026-06-27T04:56:19.1671002Z --------------------------------------------------------------------------------------
|
|
||||||
2026-06-27T04:56:20.6814950Z Determining projects to restore...
|
|
||||||
2026-06-27T04:56:21.6301085Z Restored /workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj (in 114 ms).
|
|
||||||
2026-06-27T04:56:24.2757293Z Restored /workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj (in 2.8 sec).
|
|
||||||
2026-06-27T04:56:24.2857032Z Restored /workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj (in 6 ms).
|
|
||||||
2026-06-27T04:56:24.4002183Z Restored /workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj (in 2.76 sec).
|
|
||||||
2026-06-27T04:56:25.9760981Z Restored /workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj (in 1.68 sec).
|
|
||||||
2026-06-27T04:56:26.1335761Z ::group::Run dotnet clean TaxBaik.sln -c Release
|
|
||||||
2026-06-27T04:56:26.1336322Z dotnet clean TaxBaik.sln -c Release
|
|
||||||
2026-06-27T04:56:26.1336558Z dotnet build TaxBaik.sln -c Release --no-restore
|
|
||||||
2026-06-27T04:56:26.1336735Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:26.1336858Z ::endgroup::
|
|
||||||
2026-06-27T04:56:26.3973714Z Build started 06/27/2026 04:56:26.
|
|
||||||
2026-06-27T04:56:26.5970958Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:26.5971655Z 1>ValidateSolutionConfiguration:
|
|
||||||
2026-06-27T04:56:26.5971846Z Building solution configuration "Release|Any CPU".
|
|
||||||
2026-06-27T04:56:26.9517250Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (2) on node 2 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:26.9518536Z 2>CoreClean:
|
|
||||||
2026-06-27T04:56:26.9518837Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T04:56:26.9899747Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (3) on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:26.9902304Z 3>CoreClean:
|
|
||||||
2026-06-27T04:56:26.9904320Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T04:56:27.1845185Z 3>Project "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (3) is building "/workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj" (5:3) on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.1845847Z 5>CoreClean:
|
|
||||||
2026-06-27T04:56:27.1846000Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T04:56:27.2247796Z 5>Done Building Project "/workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.2471242Z 2>Project "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (2) is building "/workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj" (4:3) on node 2 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.2472145Z 4>CoreClean:
|
|
||||||
2026-06-27T04:56:27.2472586Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T04:56:27.2711925Z 4>Done Building Project "/workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.2748289Z 3>Done Building Project "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.2955283Z 2>Project "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (2) is building "/workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj" (6:2) on node 2 (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.2959949Z 6>CoreClean:
|
|
||||||
2026-06-27T04:56:27.2962173Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T04:56:27.3191977Z 6>Done Building Project "/workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.3217578Z 2>Done Building Project "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.3229334Z 1>Done Building Project "/workspace/***/taxbaik/TaxBaik.sln" (Clean target(s)).
|
|
||||||
2026-06-27T04:56:27.3351258Z
|
|
||||||
2026-06-27T04:56:27.3351675Z Build succeeded.
|
|
||||||
2026-06-27T04:56:27.3351846Z 0 Warning(s)
|
|
||||||
2026-06-27T04:56:27.3351941Z 0 Error(s)
|
|
||||||
2026-06-27T04:56:27.3352049Z
|
|
||||||
2026-06-27T04:56:27.3352232Z Time Elapsed 00:00:00.93
|
|
||||||
2026-06-27T04:56:31.4823444Z TaxBaik.Domain -> /workspace/***/taxbaik/TaxBaik.Domain/bin/Release/net10.0/TaxBaik.Domain.dll
|
|
||||||
2026-06-27T04:56:32.7568728Z TaxBaik.Infrastructure -> /workspace/***/taxbaik/TaxBaik.Infrastructure/bin/Release/net10.0/TaxBaik.Infrastructure.dll
|
|
||||||
2026-06-27T04:56:33.2748558Z TaxBaik.Application -> /workspace/***/taxbaik/TaxBaik.Application/bin/Release/net10.0/TaxBaik.Application.dll
|
|
||||||
2026-06-27T04:56:33.8160773Z TaxBaik.Application.Tests -> /workspace/***/taxbaik/TaxBaik.Application.Tests/bin/Release/net10.0/TaxBaik.Application.Tests.dll
|
|
||||||
2026-06-27T04:56:38.6045044Z TaxBaik.Web -> /workspace/***/taxbaik/TaxBaik.Web/bin/Release/net10.0/TaxBaik.Web.dll
|
|
||||||
2026-06-27T04:56:38.6336793Z
|
|
||||||
2026-06-27T04:56:38.6356878Z Build succeeded.
|
|
||||||
2026-06-27T04:56:38.6362372Z 0 Warning(s)
|
|
||||||
2026-06-27T04:56:38.6364010Z 0 Error(s)
|
|
||||||
2026-06-27T04:56:38.6367617Z
|
|
||||||
2026-06-27T04:56:38.6369485Z Time Elapsed 00:00:10.90
|
|
||||||
2026-06-27T04:56:38.8299895Z ::group::Run dotnet test TaxBaik.sln -c Release --no-build
|
|
||||||
2026-06-27T04:56:38.8300295Z dotnet test TaxBaik.sln -c Release --no-build
|
|
||||||
2026-06-27T04:56:38.8300417Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:38.8300520Z ::endgroup::
|
|
||||||
2026-06-27T04:56:40.3696844Z Test run for /workspace/***/taxbaik/TaxBaik.Application.Tests/bin/Release/net10.0/TaxBaik.Application.Tests.dll (.NETCoreApp,Version=v10.0)
|
|
||||||
2026-06-27T04:56:40.7459566Z A total of 1 test files matched the specified pattern.
|
|
||||||
2026-06-27T04:56:41.8878250Z
|
|
||||||
2026-06-27T04:56:41.8918202Z Passed! - Failed: 0, Passed: 4, Skipped: 0, Total: 4, Duration: 53 ms - TaxBaik.Application.Tests.dll (net10.0)
|
|
||||||
2026-06-27T04:56:42.0622194Z ::group::Run dotnet publish TaxBaik.Web/ -c Release -o ./publish --no-restore
|
|
||||||
2026-06-27T04:56:42.0622569Z dotnet publish TaxBaik.Web/ -c Release -o ./publish --no-restore
|
|
||||||
2026-06-27T04:56:42.0622691Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:42.0622791Z ::endgroup::
|
|
||||||
2026-06-27T04:56:43.7414497Z TaxBaik.Domain -> /workspace/***/taxbaik/TaxBaik.Domain/bin/Release/net10.0/TaxBaik.Domain.dll
|
|
||||||
2026-06-27T04:56:43.8693471Z TaxBaik.Infrastructure -> /workspace/***/taxbaik/TaxBaik.Infrastructure/bin/Release/net10.0/TaxBaik.Infrastructure.dll
|
|
||||||
2026-06-27T04:56:43.8841172Z TaxBaik.Application -> /workspace/***/taxbaik/TaxBaik.Application/bin/Release/net10.0/TaxBaik.Application.dll
|
|
||||||
2026-06-27T04:56:44.3248352Z TaxBaik.Web -> /workspace/***/taxbaik/TaxBaik.Web/bin/Release/net10.0/TaxBaik.Web.dll
|
|
||||||
2026-06-27T04:56:46.2499198Z TaxBaik.Web -> /workspace/***/taxbaik/publish/
|
|
||||||
2026-06-27T04:56:46.4925753Z ::group::Run set -e
|
|
||||||
2026-06-27T04:56:46.4926275Z set -e
|
|
||||||
2026-06-27T04:56:46.4926406Z JWT_SECRET_KEY="***"
|
|
||||||
2026-06-27T04:56:46.4926510Z if [ -z "$JWT_SECRET_KEY" ]; then
|
|
||||||
2026-06-27T04:56:46.4926610Z echo "Missing TAXBAIK_JWT_SECRET_KEY secret" >&2
|
|
||||||
2026-06-27T04:56:46.4926692Z exit 1
|
|
||||||
2026-06-27T04:56:46.4926766Z fi
|
|
||||||
2026-06-27T04:56:46.4926835Z JWT_SECRET_KEY="$JWT_SECRET_KEY" python3 - <<'PY'
|
|
||||||
2026-06-27T04:56:46.4926911Z import json
|
|
||||||
2026-06-27T04:56:46.4926984Z import os
|
|
||||||
2026-06-27T04:56:46.4927081Z from pathlib import Path
|
|
||||||
2026-06-27T04:56:46.4927334Z
|
|
||||||
2026-06-27T04:56:46.4927408Z config = {
|
|
||||||
2026-06-27T04:56:46.4927547Z "Jwt": {
|
|
||||||
2026-06-27T04:56:46.4927619Z "SecretKey": os.environ["JWT_SECRET_KEY"]
|
|
||||||
2026-06-27T04:56:46.4927698Z }
|
|
||||||
2026-06-27T04:56:46.4927781Z }
|
|
||||||
2026-06-27T04:56:46.4927844Z
|
|
||||||
2026-06-27T04:56:46.4927906Z Path("./publish/appsettings.Production.json").write_text(
|
|
||||||
2026-06-27T04:56:46.4927981Z json.dumps(config, ensure_ascii=False, indent=2),
|
|
||||||
2026-06-27T04:56:46.4928074Z encoding="utf-8",
|
|
||||||
2026-06-27T04:56:46.4928146Z )
|
|
||||||
2026-06-27T04:56:46.4928208Z PY
|
|
||||||
2026-06-27T04:56:46.4928293Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:46.4928394Z ::endgroup::
|
|
||||||
2026-06-27T04:56:46.8011191Z ::group::Run cp -r db/migrations ./publish/migrations || true
|
|
||||||
2026-06-27T04:56:46.8011697Z cp -r db/migrations ./publish/migrations || true
|
|
||||||
2026-06-27T04:56:46.8011878Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:46.8012035Z ::endgroup::
|
|
||||||
2026-06-27T04:56:47.0307835Z ::group::Run mkdir -p ./publish/wwwroot
|
|
||||||
2026-06-27T04:56:47.0308194Z mkdir -p ./publish/wwwroot
|
|
||||||
2026-06-27T04:56:47.0308309Z COMMIT_HASH=$(git rev-parse --short HEAD)
|
|
||||||
2026-06-27T04:56:47.0308404Z BUILD_TIME=$(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
|
||||||
2026-06-27T04:56:47.0308488Z echo "Version: $COMMIT_HASH" > ./publish/wwwroot/version.txt
|
|
||||||
2026-06-27T04:56:47.0308575Z echo "Built: $BUILD_TIME" >> ./publish/wwwroot/version.txt
|
|
||||||
2026-06-27T04:56:47.0308650Z echo "✓ Version: $COMMIT_HASH"
|
|
||||||
2026-06-27T04:56:47.0308733Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:47.0308839Z ::endgroup::
|
|
||||||
2026-06-27T04:56:47.1073280Z ✓ Version: 113140e
|
|
||||||
2026-06-27T04:56:47.2424145Z ::group::Run set -e
|
|
||||||
2026-06-27T04:56:47.2424619Z set -e
|
|
||||||
2026-06-27T04:56:47.2424752Z TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
||||||
2026-06-27T04:56:47.2424842Z DEPLOY_HOME="/home/***"
|
|
||||||
2026-06-27T04:56:47.2425050Z DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_${TIMESTAMP}"
|
|
||||||
2026-06-27T04:56:47.2425299Z DEPLOY_HOST="***"
|
|
||||||
2026-06-27T04:56:47.2425403Z DEPLOY_USER="***"
|
|
||||||
2026-06-27T04:56:47.2425484Z
|
|
||||||
2026-06-27T04:56:47.2425570Z echo "=== Deploying TaxBaik v$(git rev-parse --short HEAD) ==="
|
|
||||||
2026-06-27T04:56:47.2425660Z mkdir -p ~/.ssh
|
|
||||||
2026-06-27T04:56:47.2425741Z SSH_KEY_B64="***"
|
|
||||||
2026-06-27T04:56:47.2425901Z SSH_KEY_RAW="***"
|
|
||||||
2026-06-27T04:56:47.2426443Z if [ -n "$SSH_KEY_B64" ]; then
|
|
||||||
2026-06-27T04:56:47.2426551Z printf '%s' "$SSH_KEY_B64" | base64 -d > ~/.ssh/id_ed25519
|
|
||||||
2026-06-27T04:56:47.2426649Z elif [ -n "$SSH_KEY_RAW" ]; then
|
|
||||||
2026-06-27T04:56:47.2426745Z if printf '%s' "$SSH_KEY_RAW" | grep -q 'BEGIN .*PRIVATE KEY'; then
|
|
||||||
2026-06-27T04:56:47.2426846Z printf '%b\n' "$SSH_KEY_RAW" > ~/.ssh/id_ed25519
|
|
||||||
2026-06-27T04:56:47.2426926Z else
|
|
||||||
2026-06-27T04:56:47.2426998Z printf '%s' "$SSH_KEY_RAW" | base64 -d > ~/.ssh/id_ed25519
|
|
||||||
2026-06-27T04:56:47.2427234Z fi
|
|
||||||
2026-06-27T04:56:47.2427308Z else
|
|
||||||
2026-06-27T04:56:47.2427373Z echo "Missing DEPLOY_SSH_KEY_B64 or DEPLOY_SSH_KEY secret" >&2
|
|
||||||
2026-06-27T04:56:47.2427473Z exit 1
|
|
||||||
2026-06-27T04:56:47.2427550Z fi
|
|
||||||
2026-06-27T04:56:47.2427615Z sed -i 's/\r$//' ~/.ssh/id_ed25519
|
|
||||||
2026-06-27T04:56:47.2427691Z chmod 600 ~/.ssh/id_ed25519
|
|
||||||
2026-06-27T04:56:47.2427803Z ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null || true
|
|
||||||
2026-06-27T04:56:47.2427892Z
|
|
||||||
2026-06-27T04:56:47.2427954Z tar -czf taxbaik_publish.tgz -C ./publish .
|
|
||||||
2026-06-27T04:56:47.2428033Z scp -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=yes taxbaik_publish.tgz "$DEPLOY_USER@$DEPLOY_HOST:/tmp/taxbaik_publish_${TIMESTAMP}.tgz"
|
|
||||||
2026-06-27T04:56:47.2428142Z ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=yes "$DEPLOY_USER@$DEPLOY_HOST" "
|
|
||||||
2026-06-27T04:56:47.2428232Z set -e
|
|
||||||
2026-06-27T04:56:47.2428301Z mkdir -p '$DEPLOY_DIR'
|
|
||||||
2026-06-27T04:56:47.2428382Z tar -xzf '/tmp/taxbaik_publish_${TIMESTAMP}.tgz' -C '$DEPLOY_DIR'
|
|
||||||
2026-06-27T04:56:47.2428722Z rm -f '/tmp/taxbaik_publish_${TIMESTAMP}.tgz'
|
|
||||||
2026-06-27T04:56:47.2428823Z ln -sfn '$DEPLOY_DIR' '$DEPLOY_HOME/taxbaik_active'
|
|
||||||
2026-06-27T04:56:47.2428901Z sudo systemctl restart taxbaik
|
|
||||||
2026-06-27T04:56:47.2428990Z "
|
|
||||||
2026-06-27T04:56:47.2429061Z sleep 5
|
|
||||||
2026-06-27T04:56:47.2429144Z echo "✓ Deployed to $DEPLOY_HOST:$DEPLOY_DIR"
|
|
||||||
2026-06-27T04:56:47.2429235Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T04:56:47.2429339Z ::endgroup::
|
|
||||||
2026-06-27T04:56:47.3205974Z === Deploying TaxBaik v113140e ===
|
|
||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
2026-06-27T04:57:09.9979363Z hz-prod-runner-2(version:v0.6.1) received task 227 of job browser-e2e, be triggered by event: push
|
|
||||||
2026-06-27T04:57:09.9992501Z workflow prepared
|
|
||||||
2026-06-27T04:57:09.9993351Z evaluating expression 'success()'
|
|
||||||
2026-06-27T04:57:09.9994922Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T04:57:09.9995042Z 'runs-on' key not defined in TaxBaik CI/CD/build-and-deploy
|
|
||||||
2026-06-27T04:57:09.9995157Z No steps found
|
|
||||||
2026-06-27T04:57:09.9996323Z evaluating expression 'success()'
|
|
||||||
2026-06-27T04:57:09.9996698Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T04:57:09.9996957Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T04:57:10.0095625Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T04:57:10.0095962Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T04:57:10.0401875Z Image exists? true
|
|
||||||
2026-06-27T04:57:10.0932644Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T04:57:10.2051862Z Created container name=GITEA-ACTIONS-TASK-227-WORKFLOW-TaxBaik-CI-CD-JOB-browser-e2e-9d49bf37793525c39d428236fd945da41f3f2868fa12ad17760172c047873583 id=cb1d275750d763091dbafbd4a330e4c7fd7885b4d67b98407a524394db1d2aef from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T04:57:10.2052392Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T04:57:10.2052578Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T04:57:10.2052790Z Starting container: cb1d275750d763091dbafbd4a330e4c7fd7885b4d67b98407a524394db1d2aef
|
|
||||||
2026-06-27T04:57:10.3403371Z Started container: cb1d275750d763091dbafbd4a330e4c7fd7885b4d67b98407a524394db1d2aef
|
|
||||||
2026-06-27T04:57:10.4391686Z Writing entry to tarball workflow/event.json len:4689
|
|
||||||
2026-06-27T04:57:10.4392316Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T04:57:10.4392548Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T04:57:10.4602096Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T04:57:10.4602637Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T04:57:10.9492853Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T04:57:10.9493399Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T04:57:10.9569587Z Checked out v4
|
|
||||||
2026-06-27T04:57:10.9672087Z ☁ git clone 'https://github.com/actions/setup-node' # ref=v4
|
|
||||||
2026-06-27T04:57:10.9672472Z cloning https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
-766
@@ -1,766 +0,0 @@
|
|||||||
2026-06-27T05:03:34.4472789Z hz-prod-runner-2(version:v0.6.1) received task 228 of job browser-e2e, be triggered by event: push
|
|
||||||
2026-06-27T05:03:34.4477234Z workflow prepared
|
|
||||||
2026-06-27T05:03:34.4478448Z evaluating expression 'success()'
|
|
||||||
2026-06-27T05:03:34.4479410Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T05:03:34.4479687Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T05:03:34.4573986Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T05:03:34.4574215Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T05:03:34.4836644Z Image exists? true
|
|
||||||
2026-06-27T05:03:34.5317614Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T05:03:34.6497407Z Created container name=GITEA-ACTIONS-TASK-228-WORKFLOW-TaxBaik-Browser-E2E-JOB-browser-0c3452011332633cc68f63d3d9814a22130d04a6b0d422dd40217df2432ae92c id=729e7beffb378dc6f37cb393bc7af5d1bd22b4b5ee950b07fde7f6d54bb5e844 from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T05:03:34.6497958Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T05:03:34.6498216Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T05:03:34.6498352Z Starting container: 729e7beffb378dc6f37cb393bc7af5d1bd22b4b5ee950b07fde7f6d54bb5e844
|
|
||||||
2026-06-27T05:03:34.7758449Z Started container: 729e7beffb378dc6f37cb393bc7af5d1bd22b4b5ee950b07fde7f6d54bb5e844
|
|
||||||
2026-06-27T05:03:34.8625620Z Writing entry to tarball workflow/event.json len:4761
|
|
||||||
2026-06-27T05:03:34.8626344Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T05:03:34.8626579Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T05:03:34.8804892Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T05:03:34.8805202Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T05:03:35.3781795Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T05:03:35.3782230Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T05:03:35.3845027Z Checked out v4
|
|
||||||
2026-06-27T05:03:35.3929031Z ☁ git clone 'https://github.com/actions/setup-node' # ref=v4
|
|
||||||
2026-06-27T05:03:35.3929378Z cloning https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T05:03:35.8583017Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T05:03:35.8584352Z Cloned https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T05:03:35.8693730Z Checked out v4
|
|
||||||
2026-06-27T05:03:35.8783744Z ☁ git clone 'https://github.com/actions/cache' # ref=v4
|
|
||||||
2026-06-27T05:03:35.8784101Z cloning https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T05:03:36.3659063Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T05:03:36.3659520Z Cloned https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T05:03:36.3748871Z Checked out v4
|
|
||||||
2026-06-27T05:03:36.3986601Z evaluating expression ''
|
|
||||||
2026-06-27T05:03:36.3987117Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T05:03:36.3987240Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T05:03:36.3987412Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T05:03:36.3987722Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T05:03:36.3987827Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T05:03:36.3987923Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T05:03:36.3988003Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T05:03:36.3988096Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T05:03:36.4015613Z ::group::Run Checkout code
|
|
||||||
2026-06-27T05:03:36.8596403Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T05:03:36.8601065Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T05:03:36.8606570Z ::group::Getting Git version info
|
|
||||||
2026-06-27T05:03:36.8607377Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T05:03:36.8659852Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T05:03:36.8738035Z git version 2.54.0
|
|
||||||
2026-06-27T05:03:36.8790459Z ::endgroup::
|
|
||||||
2026-06-27T05:03:36.8816791Z Temporarily overriding HOME='/tmp/708bc5bb-b43e-4597-be36-26af349a26af' before making global git config changes
|
|
||||||
2026-06-27T05:03:36.8818160Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T05:03:36.8826265Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T05:03:36.8882244Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T05:03:36.8892947Z ::group::Initializing the repository
|
|
||||||
2026-06-27T05:03:36.8901037Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T05:03:36.8967383Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T05:03:36.8967865Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T05:03:36.8967994Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T05:03:36.8968167Z hint: call:
|
|
||||||
2026-06-27T05:03:36.8968242Z hint:
|
|
||||||
2026-06-27T05:03:36.8968312Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T05:03:36.8968408Z hint:
|
|
||||||
2026-06-27T05:03:36.8968474Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T05:03:36.8968556Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T05:03:36.8968640Z hint:
|
|
||||||
2026-06-27T05:03:36.8968737Z hint: git branch -m <name>
|
|
||||||
2026-06-27T05:03:36.8968821Z hint:
|
|
||||||
2026-06-27T05:03:36.8968894Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T05:03:36.8978280Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T05:03:36.9001958Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T05:03:36.9052456Z ::endgroup::
|
|
||||||
2026-06-27T05:03:36.9052897Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T05:03:36.9064908Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T05:03:36.9114941Z ::endgroup::
|
|
||||||
2026-06-27T05:03:36.9115613Z ::group::Setting up auth
|
|
||||||
2026-06-27T05:03:36.9124618Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T05:03:36.9168642Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T05:03:36.9568629Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T05:03:36.9605899Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T05:03:36.9948755Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T05:03:37.0020804Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T05:03:37.0500003Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T05:03:37.0572364Z ::endgroup::
|
|
||||||
2026-06-27T05:03:37.0573251Z ::group::Fetching the repository
|
|
||||||
2026-06-27T05:03:37.0583278Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +640b2079b0da392093bf91bad6c89cfac7df5fc9:refs/remotes/origin/master
|
|
||||||
2026-06-27T05:03:37.2157323Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T05:03:37.2157927Z * [new ref] 640b2079b0da392093bf91bad6c89cfac7df5fc9 -> origin/master
|
|
||||||
2026-06-27T05:03:37.2178048Z ::endgroup::
|
|
||||||
2026-06-27T05:03:37.2178344Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T05:03:37.2187511Z ::endgroup::
|
|
||||||
2026-06-27T05:03:37.2195715Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T05:03:37.2236743Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T05:03:37.2273708Z ::group::Checking out the ref
|
|
||||||
2026-06-27T05:03:37.2273820Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T05:03:37.2377396Z Reset branch 'master'
|
|
||||||
2026-06-27T05:03:37.2377968Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T05:03:37.2394352Z ::endgroup::
|
|
||||||
2026-06-27T05:03:37.2436803Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T05:03:37.2474631Z 640b2079b0da392093bf91bad6c89cfac7df5fc9
|
|
||||||
2026-06-27T05:03:37.2492428Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T05:03:37.2579720Z ::endgroup::
|
|
||||||
2026-06-27T05:03:37.3230062Z ::group::Run Setup Node.js
|
|
||||||
2026-06-27T05:03:37.3230567Z with:
|
|
||||||
2026-06-27T05:03:37.3230736Z cache: npm
|
|
||||||
2026-06-27T05:03:37.3230859Z node-version: 22
|
|
||||||
2026-06-27T05:03:37.9573260Z Found in cache @ /opt/hostedtoolcache/node/22.23.1/x64
|
|
||||||
2026-06-27T05:03:37.9582299Z (node:143) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T05:03:37.9582582Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T05:03:37.9586350Z ::group::Environment details
|
|
||||||
2026-06-27T05:03:38.0767199Z node: v22.23.1
|
|
||||||
2026-06-27T05:03:38.0768088Z npm: 10.9.8
|
|
||||||
2026-06-27T05:03:38.0768530Z yarn:
|
|
||||||
2026-06-27T05:03:38.0768843Z ::endgroup::
|
|
||||||
2026-06-27T05:03:38.0792475Z [command]/opt/hostedtoolcache/node/22.23.1/x64/bin/npm config get cache
|
|
||||||
2026-06-27T05:03:38.2025400Z /root/.npm
|
|
||||||
2026-06-27T05:03:38.2414075Z npm cache is not found
|
|
||||||
2026-06-27T05:03:38.2416415Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/tsc.json
|
|
||||||
2026-06-27T05:03:38.2416816Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-stylish.json
|
|
||||||
2026-06-27T05:03:38.2417726Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-compact.json
|
|
||||||
2026-06-27T05:03:38.2529909Z ::endgroup::
|
|
||||||
2026-06-27T05:03:38.4292716Z ::group::Run Cache Playwright browsers
|
|
||||||
2026-06-27T05:03:38.4293168Z with:
|
|
||||||
2026-06-27T05:03:38.4293306Z key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
|
||||||
2026-06-27T05:03:38.4293412Z path: ~/.cache/ms-playwright
|
|
||||||
2026-06-27T05:03:38.4293517Z restore-keys: ${{ runner.os }}-playwright-
|
|
||||||
2026-06-27T05:03:39.1445952Z (node:201) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T05:03:39.1446505Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T05:03:39.1772428Z Cache not found for input keys: Linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f, Linux-playwright-
|
|
||||||
2026-06-27T05:03:39.1889628Z ::endgroup::
|
|
||||||
2026-06-27T05:03:39.3533550Z ::group::Run set -e
|
|
||||||
2026-06-27T05:03:39.3533910Z set -e
|
|
||||||
2026-06-27T05:03:39.3534009Z npm ci
|
|
||||||
2026-06-27T05:03:39.3534087Z npx playwright install chromium --with-deps
|
|
||||||
2026-06-27T05:03:39.3534171Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T05:03:39.3534262Z ::endgroup::
|
|
||||||
2026-06-27T05:03:40.8022895Z
|
|
||||||
2026-06-27T05:03:40.8023764Z added 3 packages, and audited 4 packages in 1s
|
|
||||||
2026-06-27T05:03:40.8037716Z
|
|
||||||
2026-06-27T05:03:40.8038284Z found 0 vulnerabilities
|
|
||||||
2026-06-27T05:03:41.9196332Z Installing dependencies...
|
|
||||||
2026-06-27T05:03:42.0656968Z Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
|
|
||||||
2026-06-27T05:03:42.0959115Z Get:2 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B]
|
|
||||||
2026-06-27T05:03:42.1016809Z Get:3 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
|
|
||||||
2026-06-27T05:03:42.1578104Z Get:4 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble InRelease [24.3 kB]
|
|
||||||
2026-06-27T05:03:42.1775582Z Get:5 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1487 kB]
|
|
||||||
2026-06-27T05:03:42.2428039Z Get:6 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [187 kB]
|
|
||||||
2026-06-27T05:03:42.2555437Z Get:7 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [1339 kB]
|
|
||||||
2026-06-27T05:03:42.2613296Z Get:8 https://packages.microsoft.com/ubuntu/24.04/prod noble/main all Packages [643 B]
|
|
||||||
2026-06-27T05:03:42.2712263Z Get:9 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [976 kB]
|
|
||||||
2026-06-27T05:03:42.2824486Z Get:10 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [43.8 kB]
|
|
||||||
2026-06-27T05:03:42.2993167Z Get:11 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
|
|
||||||
2026-06-27T05:03:42.3608863Z Get:12 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble/main amd64 Packages [2988 B]
|
|
||||||
2026-06-27T05:03:42.3650224Z Get:13 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
|
|
||||||
2026-06-27T05:03:42.4055776Z Get:14 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
|
|
||||||
2026-06-27T05:03:42.4408100Z Get:15 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
|
|
||||||
2026-06-27T05:03:42.4919178Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
|
|
||||||
2026-06-27T05:03:42.6231431Z Get:17 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
|
|
||||||
2026-06-27T05:03:42.6295144Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [49.5 kB]
|
|
||||||
2026-06-27T05:03:42.6301838Z Get:19 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [2108 kB]
|
|
||||||
2026-06-27T05:03:42.6397636Z Get:20 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [1412 kB]
|
|
||||||
2026-06-27T05:03:42.6455192Z Get:21 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1296 kB]
|
|
||||||
2026-06-27T05:03:42.6508169Z Get:22 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [35.9 kB]
|
|
||||||
2026-06-27T05:03:42.6563209Z Get:23 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Packages [671 B]
|
|
||||||
2026-06-27T05:03:42.6619804Z Get:24 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [48.9 kB]
|
|
||||||
2026-06-27T05:03:43.2112943Z Get:25 https://packagecloud.io/github/git-lfs/ubuntu noble InRelease [29.2 kB]
|
|
||||||
2026-06-27T05:03:43.9355468Z Get:26 https://packagecloud.io/github/git-lfs/ubuntu noble/main amd64 Packages [1273 B]
|
|
||||||
2026-06-27T05:03:43.9605203Z Fetched 31.3 MB in 2s (15.9 MB/s)
|
|
||||||
2026-06-27T05:03:44.9460663Z Reading package lists...
|
|
||||||
2026-06-27T05:03:45.8983583Z Reading package lists...
|
|
||||||
2026-06-27T05:03:46.1734209Z Building dependency tree...
|
|
||||||
2026-06-27T05:03:46.1738931Z Reading state information...
|
|
||||||
2026-06-27T05:03:46.5025756Z libcairo2 is already the newest version (1.18.0-3build1).
|
|
||||||
2026-06-27T05:03:46.5030253Z libcairo2 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5030927Z libdbus-1-3 is already the newest version (1.14.10-4ubuntu4.1).
|
|
||||||
2026-06-27T05:03:46.5031071Z libdbus-1-3 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5031760Z libglib2.0-0t64 is already the newest version (2.80.0-6ubuntu3.8).
|
|
||||||
2026-06-27T05:03:46.5031913Z libglib2.0-0t64 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5033681Z libpango-1.0-0 is already the newest version (1.52.1+ds-1build1).
|
|
||||||
2026-06-27T05:03:46.5033847Z libpango-1.0-0 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5033982Z libx11-6 is already the newest version (2:1.8.7-1build1).
|
|
||||||
2026-06-27T05:03:46.5036872Z libx11-6 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5037063Z libxcb1 is already the newest version (1.15-1ubuntu2).
|
|
||||||
2026-06-27T05:03:46.5037153Z libxcb1 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5037603Z libxext6 is already the newest version (2:1.3.4-1build2).
|
|
||||||
2026-06-27T05:03:46.5037794Z libxext6 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5037881Z libfontconfig1 is already the newest version (2.15.0-1.1ubuntu2).
|
|
||||||
2026-06-27T05:03:46.5037983Z libfontconfig1 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5040026Z libfreetype6 is already the newest version (2.13.2+dfsg-1ubuntu0.1).
|
|
||||||
2026-06-27T05:03:46.5040718Z libfreetype6 set to manually installed.
|
|
||||||
2026-06-27T05:03:46.5040830Z The following additional packages will be installed:
|
|
||||||
2026-06-27T05:03:46.5043964Z at-spi2-common libasound2-data libavahi-client3 libavahi-common-data
|
|
||||||
2026-06-27T05:03:46.5044200Z libavahi-common3 libdrm-amdgpu1 libdrm-common libdrm-intel1 libfontenc1
|
|
||||||
2026-06-27T05:03:46.5044306Z libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T05:03:46.5044389Z libpciaccess0 libsensors-config libsensors5 libvulkan1 libx11-xcb1 libxaw7
|
|
||||||
2026-06-27T05:03:46.5044472Z libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-sync1
|
|
||||||
2026-06-27T05:03:46.5044561Z libxcb-xfixes0 libxfont2 libxi6 libxkbfile1 libxmu6 libxmuu1 libxpm4
|
|
||||||
2026-06-27T05:03:46.5044963Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T05:03:46.5045073Z xfonts-encodings xfonts-utils xkb-data xserver-common
|
|
||||||
2026-06-27T05:03:46.5045177Z Suggested packages:
|
|
||||||
2026-06-27T05:03:46.5045262Z alsa-utils libasound2-plugins cups-common pciutils lm-sensors
|
|
||||||
2026-06-27T05:03:46.5045553Z Recommended packages:
|
|
||||||
2026-06-27T05:03:46.5045692Z fonts-ipafont-mincho fonts-liberation-sans-narrow fonts-tlwg-loma
|
|
||||||
2026-06-27T05:03:46.5045789Z alsa-ucm-conf alsa-topology-conf at-spi2-core mesa-vulkan-drivers
|
|
||||||
2026-06-27T05:03:46.5045881Z | vulkan-icd xfonts-base
|
|
||||||
2026-06-27T05:03:46.5983758Z The following NEW packages will be installed:
|
|
||||||
2026-06-27T05:03:46.5984227Z at-spi2-common fonts-freefont-ttf fonts-ipafont-gothic fonts-liberation
|
|
||||||
2026-06-27T05:03:46.5984480Z fonts-noto-color-emoji fonts-tlwg-loma-otf fonts-unifont fonts-wqy-zenhei
|
|
||||||
2026-06-27T05:03:46.5984592Z libasound2-data libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64
|
|
||||||
2026-06-27T05:03:46.5984696Z libatspi2.0-0t64 libavahi-client3 libavahi-common-data libavahi-common3
|
|
||||||
2026-06-27T05:03:46.5986735Z libcups2t64 libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm2 libfontenc1
|
|
||||||
2026-06-27T05:03:46.5986953Z libgbm1 libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T05:03:46.5990878Z libnspr4 libnss3 libpciaccess0 libsensors-config libsensors5 libvulkan1
|
|
||||||
2026-06-27T05:03:46.5991037Z libx11-xcb1 libxaw7 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0
|
|
||||||
2026-06-27T05:03:46.5991183Z libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxdamage1 libxfixes3 libxfont2
|
|
||||||
2026-06-27T05:03:46.5991270Z libxi6 libxkbcommon0 libxkbfile1 libxmu6 libxmuu1 libxpm4 libxrandr2
|
|
||||||
2026-06-27T05:03:46.5996272Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T05:03:46.5996493Z xfonts-cyrillic xfonts-encodings xfonts-scalable xfonts-utils xkb-data
|
|
||||||
2026-06-27T05:03:46.5996600Z xserver-common xvfb
|
|
||||||
2026-06-27T05:03:46.6603419Z 0 upgraded, 66 newly installed, 0 to remove and 52 not upgraded.
|
|
||||||
2026-06-27T05:03:46.6604168Z Need to get 79.3 MB of archives.
|
|
||||||
2026-06-27T05:03:46.6604433Z After this operation, 303 MB of additional disk space will be used.
|
|
||||||
2026-06-27T05:03:46.6604671Z Get:1 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3513 kB]
|
|
||||||
2026-06-27T05:03:46.7809705Z Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xkb-data all 2.41-2ubuntu1.1 [397 kB]
|
|
||||||
2026-06-27T05:03:46.7877719Z Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-common all 2.4.125-1ubuntu0.1~24.04.2 [9250 B]
|
|
||||||
2026-06-27T05:03:46.7956448Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm2 amd64 2.4.125-1ubuntu0.1~24.04.2 [41.4 kB]
|
|
||||||
2026-06-27T05:03:46.8037972Z Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors-config all 1:3.6.0-9build1 [5546 B]
|
|
||||||
2026-06-27T05:03:46.8124700Z Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors5 amd64 1:3.6.0-9build1 [26.6 kB]
|
|
||||||
2026-06-27T05:03:46.8208898Z Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbcommon0 amd64 1.6.0-1build1 [122 kB]
|
|
||||||
2026-06-27T05:03:46.8304453Z Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmuu1 amd64 2:1.1.3-3build2 [8958 B]
|
|
||||||
2026-06-27T05:03:46.8390347Z Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 xauth amd64 1:1.1.2-1build1 [25.6 kB]
|
|
||||||
2026-06-27T05:03:46.8468025Z Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 at-spi2-common all 2.52.0-1build1 [8674 B]
|
|
||||||
2026-06-27T05:03:46.8553440Z Get:11 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-freefont-ttf all 20211204+svn4273-2 [5641 kB]
|
|
||||||
2026-06-27T05:03:46.8942685Z Get:12 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-liberation all 1:2.1.5-3 [1603 kB]
|
|
||||||
2026-06-27T05:03:46.9059170Z Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 fonts-noto-color-emoji all 2.047-0ubuntu0.24.04.1 [9764 kB]
|
|
||||||
2026-06-27T05:03:46.9683189Z Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-tlwg-loma-otf all 1:0.7.3-1 [107 kB]
|
|
||||||
2026-06-27T05:03:46.9699278Z Get:15 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-unifont all 1:15.1.01-1build1 [2993 kB]
|
|
||||||
2026-06-27T05:03:46.9869770Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-wqy-zenhei all 0.9.45-8 [7472 kB]
|
|
||||||
2026-06-27T05:03:47.0353567Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.2 [21.3 kB]
|
|
||||||
2026-06-27T05:03:47.0355935Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.2 [398 kB]
|
|
||||||
2026-06-27T05:03:47.0387303Z Get:19 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk1.0-0t64 amd64 2.52.0-1build1 [55.3 kB]
|
|
||||||
2026-06-27T05:03:47.0391017Z Get:20 http://archive.ubuntu.com/ubuntu noble/main amd64 libxi6 amd64 2:1.8.1-1build1 [32.4 kB]
|
|
||||||
2026-06-27T05:03:47.0400033Z Get:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libatspi2.0-0t64 amd64 2.52.0-1build1 [80.5 kB]
|
|
||||||
2026-06-27T05:03:47.0405531Z Get:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk-bridge2.0-0t64 amd64 2.52.0-1build1 [66.0 kB]
|
|
||||||
2026-06-27T05:03:47.0415032Z Get:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common-data amd64 0.8-13ubuntu6.2 [30.1 kB]
|
|
||||||
2026-06-27T05:03:47.0471306Z Get:24 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common3 amd64 0.8-13ubuntu6.2 [23.4 kB]
|
|
||||||
2026-06-27T05:03:47.0563441Z Get:25 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-client3 amd64 0.8-13ubuntu6.2 [26.8 kB]
|
|
||||||
2026-06-27T05:03:47.0627207Z Get:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcups2t64 amd64 2.4.7-1.2ubuntu7.14 [274 kB]
|
|
||||||
2026-06-27T05:03:47.0785578Z Get:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-amdgpu1 amd64 2.4.125-1ubuntu0.1~24.04.2 [21.4 kB]
|
|
||||||
2026-06-27T05:03:47.0881051Z Get:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpciaccess0 amd64 0.17-3ubuntu0.24.04.2 [18.9 kB]
|
|
||||||
2026-06-27T05:03:47.0964973Z Get:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-intel1 amd64 2.4.125-1ubuntu0.1~24.04.2 [63.9 kB]
|
|
||||||
2026-06-27T05:03:47.1075155Z Get:30 http://archive.ubuntu.com/ubuntu noble/main amd64 libfontenc1 amd64 1:1.1.8-1build1 [14.0 kB]
|
|
||||||
2026-06-27T05:03:47.1154955Z Get:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libllvm20 amd64 1:20.1.2-0ubuntu1~24.04.3 [30.6 MB]
|
|
||||||
2026-06-27T05:03:47.3311077Z Get:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-xcb1 amd64 2:1.8.7-1build1 [7800 B]
|
|
||||||
2026-06-27T05:03:47.3314370Z Get:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-dri3-0 amd64 1.15-1ubuntu2 [7142 B]
|
|
||||||
2026-06-27T05:03:47.3317224Z Get:34 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-present0 amd64 1.15-1ubuntu2 [5676 B]
|
|
||||||
2026-06-27T05:03:47.3320406Z Get:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-randr0 amd64 1.15-1ubuntu2 [17.9 kB]
|
|
||||||
2026-06-27T05:03:47.3323204Z Get:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-sync1 amd64 1.15-1ubuntu2 [9312 B]
|
|
||||||
2026-06-27T05:03:47.3325979Z Get:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-xfixes0 amd64 1.15-1ubuntu2 [10.2 kB]
|
|
||||||
2026-06-27T05:03:47.3329440Z Get:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libxshmfence1 amd64 1.3-1build5 [4764 B]
|
|
||||||
2026-06-27T05:03:47.3340744Z Get:39 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 mesa-libgallium amd64 25.2.8-0ubuntu0.24.04.2 [10.8 MB]
|
|
||||||
2026-06-27T05:03:47.3938332Z Get:40 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgbm1 amd64 25.2.8-0ubuntu0.24.04.2 [34.2 kB]
|
|
||||||
2026-06-27T05:03:47.3947823Z Get:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libvulkan1 amd64 1.3.275.0-1build1 [142 kB]
|
|
||||||
2026-06-27T05:03:47.3961752Z Get:42 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgl1-mesa-dri amd64 25.2.8-0ubuntu0.24.04.2 [37.9 kB]
|
|
||||||
2026-06-27T05:03:47.3977381Z Get:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-glx0 amd64 1.15-1ubuntu2 [24.8 kB]
|
|
||||||
2026-06-27T05:03:47.3981073Z Get:44 http://archive.ubuntu.com/ubuntu noble/main amd64 libxxf86vm1 amd64 1:1.1.4-1build4 [9282 B]
|
|
||||||
2026-06-27T05:03:47.3984131Z Get:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libglx-mesa0 amd64 25.2.8-0ubuntu0.24.04.2 [110 kB]
|
|
||||||
2026-06-27T05:03:47.4058006Z Get:46 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 [117 kB]
|
|
||||||
2026-06-27T05:03:47.4157290Z Get:47 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss3 amd64 2:3.98-1ubuntu0.1 [1445 kB]
|
|
||||||
2026-06-27T05:03:47.4279396Z Get:48 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmu6 amd64 2:1.1.3-3build2 [47.6 kB]
|
|
||||||
2026-06-27T05:03:47.4334449Z Get:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libxpm4 amd64 1:3.5.17-1build2 [36.5 kB]
|
|
||||||
2026-06-27T05:03:47.4436704Z Get:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libxaw7 amd64 2:1.0.14-1build2 [187 kB]
|
|
||||||
2026-06-27T05:03:47.4535460Z Get:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcomposite1 amd64 1:0.4.5-1build3 [6320 B]
|
|
||||||
2026-06-27T05:03:47.4609763Z Get:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libxdamage1 amd64 1:1.1.6-1build1 [6150 B]
|
|
||||||
2026-06-27T05:03:47.4693310Z Get:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfixes3 amd64 1:6.0.0-2build1 [10.8 kB]
|
|
||||||
2026-06-27T05:03:47.4785385Z Get:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfont2 amd64 1:2.0.6-1build1 [93.0 kB]
|
|
||||||
2026-06-27T05:03:47.4852659Z Get:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbfile1 amd64 1:1.1.0-1build4 [70.0 kB]
|
|
||||||
2026-06-27T05:03:47.4945125Z Get:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libxrandr2 amd64 2:1.5.2-2build1 [19.7 kB]
|
|
||||||
2026-06-27T05:03:47.5041934Z Get:57 http://archive.ubuntu.com/ubuntu noble/main amd64 x11-xkb-utils amd64 7.7+8build2 [170 kB]
|
|
||||||
2026-06-27T05:03:47.5110926Z Get:58 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 [578 kB]
|
|
||||||
2026-06-27T05:03:47.5234738Z Get:59 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-utils amd64 1:7.7+6build3 [94.4 kB]
|
|
||||||
2026-06-27T05:03:47.5330021Z Get:60 http://archive.ubuntu.com/ubuntu noble/universe amd64 xfonts-cyrillic all 1:1.0.5+nmu1 [384 kB]
|
|
||||||
2026-06-27T05:03:47.5437047Z Get:61 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-scalable all 1:1.0.3-1.3 [304 kB]
|
|
||||||
2026-06-27T05:03:47.5530065Z Get:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xserver-common all 2:21.1.12-1ubuntu1.6 [34.7 kB]
|
|
||||||
2026-06-27T05:03:47.5652482Z Get:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libglvnd0 amd64 1.7.0-1build1 [69.6 kB]
|
|
||||||
2026-06-27T05:03:47.5770020Z Get:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libglx0 amd64 1.7.0-1build1 [38.6 kB]
|
|
||||||
2026-06-27T05:03:47.5856885Z Get:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libgl1 amd64 1.7.0-1build1 [102 kB]
|
|
||||||
2026-06-27T05:03:47.5968781Z Get:66 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 xvfb amd64 2:21.1.12-1ubuntu1.6 [877 kB]
|
|
||||||
2026-06-27T05:03:47.8349307Z debconf: delaying package configuration, since apt-utils is not installed
|
|
||||||
2026-06-27T05:03:47.8876315Z Fetched 79.3 MB in 1s (80.3 MB/s)
|
|
||||||
2026-06-27T05:03:47.9196945Z Selecting previously unselected package fonts-ipafont-gothic.
|
|
||||||
2026-06-27T05:03:48.0973964Z (Reading database ...
|
|
||||||
(Reading database ... 5%
|
|
||||||
(Reading database ... 10%
|
|
||||||
(Reading database ... 15%
|
|
||||||
(Reading database ... 20%
|
|
||||||
(Reading database ... 25%
|
|
||||||
(Reading database ... 30%
|
|
||||||
(Reading database ... 35%
|
|
||||||
(Reading database ... 40%
|
|
||||||
(Reading database ... 45%
|
|
||||||
(Reading database ... 50%
|
|
||||||
(Reading database ... 55%
|
|
||||||
(Reading database ... 60%
|
|
||||||
(Reading database ... 65%
|
|
||||||
(Reading database ... 70%
|
|
||||||
(Reading database ... 75%
|
|
||||||
(Reading database ... 80%
|
|
||||||
(Reading database ... 85%
|
|
||||||
(Reading database ... 90%
|
|
||||||
(Reading database ... 95%
|
|
||||||
(Reading database ... 100%
|
|
||||||
(Reading database ... 26518 files and directories currently installed.)
|
|
||||||
2026-06-27T05:03:48.0974807Z Preparing to unpack .../00-fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
|
|
||||||
2026-06-27T05:03:48.1082583Z Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T05:03:48.4031621Z Selecting previously unselected package xkb-data.
|
|
||||||
2026-06-27T05:03:48.4060725Z Preparing to unpack .../01-xkb-data_2.41-2ubuntu1.1_all.deb ...
|
|
||||||
2026-06-27T05:03:48.4086859Z Unpacking xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T05:03:48.4822663Z Selecting previously unselected package libdrm-common.
|
|
||||||
2026-06-27T05:03:48.4851249Z Preparing to unpack .../02-libdrm-common_2.4.125-1ubuntu0.1~24.04.2_all.deb ...
|
|
||||||
2026-06-27T05:03:48.4883947Z Unpacking libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:48.5126530Z Selecting previously unselected package libdrm2:amd64.
|
|
||||||
2026-06-27T05:03:48.5163740Z Preparing to unpack .../03-libdrm2_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:48.5247234Z Unpacking libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:48.5574655Z Selecting previously unselected package libsensors-config.
|
|
||||||
2026-06-27T05:03:48.5607811Z Preparing to unpack .../04-libsensors-config_1%3a3.6.0-9build1_all.deb ...
|
|
||||||
2026-06-27T05:03:48.5637165Z Unpacking libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T05:03:48.5848037Z Selecting previously unselected package libsensors5:amd64.
|
|
||||||
2026-06-27T05:03:48.5860699Z Preparing to unpack .../05-libsensors5_1%3a3.6.0-9build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:48.6445351Z Unpacking libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T05:03:48.6728659Z Selecting previously unselected package libxkbcommon0:amd64.
|
|
||||||
2026-06-27T05:03:48.6761011Z Preparing to unpack .../06-libxkbcommon0_1.6.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:48.6787239Z Unpacking libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T05:03:48.7023182Z Selecting previously unselected package libxmuu1:amd64.
|
|
||||||
2026-06-27T05:03:48.7055976Z Preparing to unpack .../07-libxmuu1_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:48.7074750Z Unpacking libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T05:03:48.7308431Z Selecting previously unselected package xauth.
|
|
||||||
2026-06-27T05:03:48.7320623Z Preparing to unpack .../08-xauth_1%3a1.1.2-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:48.7341843Z Unpacking xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T05:03:48.7538665Z Selecting previously unselected package at-spi2-common.
|
|
||||||
2026-06-27T05:03:48.7550731Z Preparing to unpack .../09-at-spi2-common_2.52.0-1build1_all.deb ...
|
|
||||||
2026-06-27T05:03:48.7573006Z Unpacking at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:48.7778611Z Selecting previously unselected package fonts-freefont-ttf.
|
|
||||||
2026-06-27T05:03:48.7792971Z Preparing to unpack .../10-fonts-freefont-ttf_20211204+svn4273-2_all.deb ...
|
|
||||||
2026-06-27T05:03:48.7818022Z Unpacking fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T05:03:48.8978122Z Selecting previously unselected package fonts-liberation.
|
|
||||||
2026-06-27T05:03:48.8997829Z Preparing to unpack .../11-fonts-liberation_1%3a2.1.5-3_all.deb ...
|
|
||||||
2026-06-27T05:03:48.9015456Z Unpacking fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T05:03:48.9524035Z Selecting previously unselected package fonts-noto-color-emoji.
|
|
||||||
2026-06-27T05:03:48.9565036Z Preparing to unpack .../12-fonts-noto-color-emoji_2.047-0ubuntu0.24.04.1_all.deb ...
|
|
||||||
2026-06-27T05:03:48.9596491Z Unpacking fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T05:03:49.1167418Z Selecting previously unselected package fonts-tlwg-loma-otf.
|
|
||||||
2026-06-27T05:03:49.1199369Z Preparing to unpack .../13-fonts-tlwg-loma-otf_1%3a0.7.3-1_all.deb ...
|
|
||||||
2026-06-27T05:03:49.1223278Z Unpacking fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T05:03:49.1503811Z Selecting previously unselected package fonts-unifont.
|
|
||||||
2026-06-27T05:03:49.1535020Z Preparing to unpack .../14-fonts-unifont_1%3a15.1.01-1build1_all.deb ...
|
|
||||||
2026-06-27T05:03:49.1556920Z Unpacking fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T05:03:49.2892089Z Selecting previously unselected package fonts-wqy-zenhei.
|
|
||||||
2026-06-27T05:03:49.2923511Z Preparing to unpack .../15-fonts-wqy-zenhei_0.9.45-8_all.deb ...
|
|
||||||
2026-06-27T05:03:49.3101208Z Unpacking fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T05:03:49.8878955Z Selecting previously unselected package libasound2-data.
|
|
||||||
2026-06-27T05:03:49.8907595Z Preparing to unpack .../16-libasound2-data_1.2.11-1ubuntu0.2_all.deb ...
|
|
||||||
2026-06-27T05:03:49.8933946Z Unpacking libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T05:03:49.9283589Z Selecting previously unselected package libasound2t64:amd64.
|
|
||||||
2026-06-27T05:03:49.9285798Z Preparing to unpack .../17-libasound2t64_1.2.11-1ubuntu0.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:49.9312658Z Unpacking libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T05:03:49.9928919Z Selecting previously unselected package libatk1.0-0t64:amd64.
|
|
||||||
2026-06-27T05:03:49.9945176Z Preparing to unpack .../18-libatk1.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:49.9960739Z Unpacking libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:50.0260579Z Selecting previously unselected package libxi6:amd64.
|
|
||||||
2026-06-27T05:03:50.0272150Z Preparing to unpack .../19-libxi6_2%3a1.8.1-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.0290412Z Unpacking libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T05:03:50.1095135Z Selecting previously unselected package libatspi2.0-0t64:amd64.
|
|
||||||
2026-06-27T05:03:50.1095815Z Preparing to unpack .../20-libatspi2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.1112023Z Unpacking libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:50.1491432Z Selecting previously unselected package libatk-bridge2.0-0t64:amd64.
|
|
||||||
2026-06-27T05:03:50.1507422Z Preparing to unpack .../21-libatk-bridge2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.1531328Z Unpacking libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:50.1798755Z Selecting previously unselected package libavahi-common-data:amd64.
|
|
||||||
2026-06-27T05:03:50.1811070Z Preparing to unpack .../22-libavahi-common-data_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.1834018Z Unpacking libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:50.2060891Z Selecting previously unselected package libavahi-common3:amd64.
|
|
||||||
2026-06-27T05:03:50.2066810Z Preparing to unpack .../23-libavahi-common3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.2087070Z Unpacking libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:50.2339970Z Selecting previously unselected package libavahi-client3:amd64.
|
|
||||||
2026-06-27T05:03:50.2346360Z Preparing to unpack .../24-libavahi-client3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.2372831Z Unpacking libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:50.2628128Z Selecting previously unselected package libcups2t64:amd64.
|
|
||||||
2026-06-27T05:03:50.2646634Z Preparing to unpack .../25-libcups2t64_2.4.7-1.2ubuntu7.14_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.2668908Z Unpacking libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T05:03:50.3001930Z Selecting previously unselected package libdrm-amdgpu1:amd64.
|
|
||||||
2026-06-27T05:03:50.3002543Z Preparing to unpack .../26-libdrm-amdgpu1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.3021001Z Unpacking libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:50.3263632Z Selecting previously unselected package libpciaccess0:amd64.
|
|
||||||
2026-06-27T05:03:50.3316040Z Preparing to unpack .../27-libpciaccess0_0.17-3ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.3344539Z Unpacking libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:50.3621077Z Selecting previously unselected package libdrm-intel1:amd64.
|
|
||||||
2026-06-27T05:03:50.3632116Z Preparing to unpack .../28-libdrm-intel1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.3651623Z Unpacking libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:50.3898779Z Selecting previously unselected package libfontenc1:amd64.
|
|
||||||
2026-06-27T05:03:50.3926371Z Preparing to unpack .../29-libfontenc1_1%3a1.1.8-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.3945541Z Unpacking libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T05:03:50.4228650Z Selecting previously unselected package libllvm20:amd64.
|
|
||||||
2026-06-27T05:03:50.4243240Z Preparing to unpack .../30-libllvm20_1%3a20.1.2-0ubuntu1~24.04.3_amd64.deb ...
|
|
||||||
2026-06-27T05:03:50.4277362Z Unpacking libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T05:03:51.1945688Z Selecting previously unselected package libx11-xcb1:amd64.
|
|
||||||
2026-06-27T05:03:51.1978441Z Preparing to unpack .../31-libx11-xcb1_2%3a1.8.7-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.1997818Z Unpacking libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T05:03:51.2303914Z Selecting previously unselected package libxcb-dri3-0:amd64.
|
|
||||||
2026-06-27T05:03:51.2306613Z Preparing to unpack .../32-libxcb-dri3-0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.2335569Z Unpacking libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.2653511Z Selecting previously unselected package libxcb-present0:amd64.
|
|
||||||
2026-06-27T05:03:51.2683365Z Preparing to unpack .../33-libxcb-present0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.2719323Z Unpacking libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.3024417Z Selecting previously unselected package libxcb-randr0:amd64.
|
|
||||||
2026-06-27T05:03:51.3052084Z Preparing to unpack .../34-libxcb-randr0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.3083261Z Unpacking libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.3406389Z Selecting previously unselected package libxcb-sync1:amd64.
|
|
||||||
2026-06-27T05:03:51.3432911Z Preparing to unpack .../35-libxcb-sync1_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.3458534Z Unpacking libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.3787405Z Selecting previously unselected package libxcb-xfixes0:amd64.
|
|
||||||
2026-06-27T05:03:51.3812637Z Preparing to unpack .../36-libxcb-xfixes0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.3839529Z Unpacking libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.4159717Z Selecting previously unselected package libxshmfence1:amd64.
|
|
||||||
2026-06-27T05:03:51.4178371Z Preparing to unpack .../37-libxshmfence1_1.3-1build5_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.4206795Z Unpacking libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T05:03:51.4482213Z Selecting previously unselected package mesa-libgallium:amd64.
|
|
||||||
2026-06-27T05:03:51.4514699Z Preparing to unpack .../38-mesa-libgallium_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.4531872Z Unpacking mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:51.7058441Z Selecting previously unselected package libgbm1:amd64.
|
|
||||||
2026-06-27T05:03:51.7075418Z Preparing to unpack .../39-libgbm1_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.7102471Z Unpacking libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:51.7369143Z Selecting previously unselected package libvulkan1:amd64.
|
|
||||||
2026-06-27T05:03:51.7374302Z Preparing to unpack .../40-libvulkan1_1.3.275.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.7400194Z Unpacking libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T05:03:51.7732768Z Selecting previously unselected package libgl1-mesa-dri:amd64.
|
|
||||||
2026-06-27T05:03:51.7774246Z Preparing to unpack .../41-libgl1-mesa-dri_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.7878618Z Unpacking libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:51.8222671Z Selecting previously unselected package libxcb-glx0:amd64.
|
|
||||||
2026-06-27T05:03:51.8256344Z Preparing to unpack .../42-libxcb-glx0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.8288734Z Unpacking libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:51.8551590Z Selecting previously unselected package libxxf86vm1:amd64.
|
|
||||||
2026-06-27T05:03:51.8580376Z Preparing to unpack .../43-libxxf86vm1_1%3a1.1.4-1build4_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.8605178Z Unpacking libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T05:03:51.8846322Z Selecting previously unselected package libglx-mesa0:amd64.
|
|
||||||
2026-06-27T05:03:51.8878710Z Preparing to unpack .../44-libglx-mesa0_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.8897410Z Unpacking libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:51.9133754Z Selecting previously unselected package libnspr4:amd64.
|
|
||||||
2026-06-27T05:03:51.9168829Z Preparing to unpack .../45-libnspr4_2%3a4.35-1.1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.9193272Z Unpacking libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T05:03:51.9528756Z Selecting previously unselected package libnss3:amd64.
|
|
||||||
2026-06-27T05:03:51.9552805Z Preparing to unpack .../46-libnss3_2%3a3.98-1ubuntu0.1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:51.9582534Z Unpacking libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T05:03:52.0149694Z Selecting previously unselected package libxmu6:amd64.
|
|
||||||
2026-06-27T05:03:52.0179910Z Preparing to unpack .../47-libxmu6_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.0207740Z Unpacking libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T05:03:52.0692071Z Selecting previously unselected package libxpm4:amd64.
|
|
||||||
2026-06-27T05:03:52.0719622Z Preparing to unpack .../48-libxpm4_1%3a3.5.17-1build2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.0888846Z Unpacking libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T05:03:52.1524085Z Selecting previously unselected package libxaw7:amd64.
|
|
||||||
2026-06-27T05:03:52.1563258Z Preparing to unpack .../49-libxaw7_2%3a1.0.14-1build2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.1629831Z Unpacking libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T05:03:52.1971263Z Selecting previously unselected package libxcomposite1:amd64.
|
|
||||||
2026-06-27T05:03:52.2008041Z Preparing to unpack .../50-libxcomposite1_1%3a0.4.5-1build3_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.2040834Z Unpacking libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T05:03:52.2346721Z Selecting previously unselected package libxdamage1:amd64.
|
|
||||||
2026-06-27T05:03:52.2404951Z Preparing to unpack .../51-libxdamage1_1%3a1.1.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.2434919Z Unpacking libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T05:03:52.2721372Z Selecting previously unselected package libxfixes3:amd64.
|
|
||||||
2026-06-27T05:03:52.2754943Z Preparing to unpack .../52-libxfixes3_1%3a6.0.0-2build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.2786629Z Unpacking libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T05:03:52.3089454Z Selecting previously unselected package libxfont2:amd64.
|
|
||||||
2026-06-27T05:03:52.3101819Z Preparing to unpack .../53-libxfont2_1%3a2.0.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.3126670Z Unpacking libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T05:03:52.3420860Z Selecting previously unselected package libxkbfile1:amd64.
|
|
||||||
2026-06-27T05:03:52.3460191Z Preparing to unpack .../54-libxkbfile1_1%3a1.1.0-1build4_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.3497897Z Unpacking libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T05:03:52.3792507Z Selecting previously unselected package libxrandr2:amd64.
|
|
||||||
2026-06-27T05:03:52.3825039Z Preparing to unpack .../55-libxrandr2_2%3a1.5.2-2build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.3844434Z Unpacking libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T05:03:52.4078541Z Selecting previously unselected package x11-xkb-utils.
|
|
||||||
2026-06-27T05:03:52.4113337Z Preparing to unpack .../56-x11-xkb-utils_7.7+8build2_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.4140292Z Unpacking x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T05:03:52.4408851Z Selecting previously unselected package xfonts-encodings.
|
|
||||||
2026-06-27T05:03:52.4435645Z Preparing to unpack .../57-xfonts-encodings_1%3a1.0.5-0ubuntu2_all.deb ...
|
|
||||||
2026-06-27T05:03:52.4453715Z Unpacking xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T05:03:52.4771188Z Selecting previously unselected package xfonts-utils.
|
|
||||||
2026-06-27T05:03:52.4806262Z Preparing to unpack .../58-xfonts-utils_1%3a7.7+6build3_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.4828501Z Unpacking xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T05:03:52.5206725Z Selecting previously unselected package xfonts-cyrillic.
|
|
||||||
2026-06-27T05:03:52.5229522Z Preparing to unpack .../59-xfonts-cyrillic_1%3a1.0.5+nmu1_all.deb ...
|
|
||||||
2026-06-27T05:03:52.5253935Z Unpacking xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T05:03:52.5710524Z Selecting previously unselected package xfonts-scalable.
|
|
||||||
2026-06-27T05:03:52.5753480Z Preparing to unpack .../60-xfonts-scalable_1%3a1.0.3-1.3_all.deb ...
|
|
||||||
2026-06-27T05:03:52.5787097Z Unpacking xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T05:03:52.6130349Z Selecting previously unselected package xserver-common.
|
|
||||||
2026-06-27T05:03:52.6164189Z Preparing to unpack .../61-xserver-common_2%3a21.1.12-1ubuntu1.6_all.deb ...
|
|
||||||
2026-06-27T05:03:52.6186350Z Unpacking xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T05:03:52.6489802Z Selecting previously unselected package libglvnd0:amd64.
|
|
||||||
2026-06-27T05:03:52.6519485Z Preparing to unpack .../62-libglvnd0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.6541544Z Unpacking libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:52.6908086Z Selecting previously unselected package libglx0:amd64.
|
|
||||||
2026-06-27T05:03:52.6939666Z Preparing to unpack .../63-libglx0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.6966413Z Unpacking libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:52.8146507Z Selecting previously unselected package libgl1:amd64.
|
|
||||||
2026-06-27T05:03:52.8175689Z Preparing to unpack .../64-libgl1_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.8220815Z Unpacking libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:52.8551008Z Selecting previously unselected package xvfb.
|
|
||||||
2026-06-27T05:03:52.8568939Z Preparing to unpack .../65-xvfb_2%3a21.1.12-1ubuntu1.6_amd64.deb ...
|
|
||||||
2026-06-27T05:03:52.8601944Z Unpacking xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T05:03:52.9196842Z Setting up libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:52.9270072Z Setting up libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T05:03:52.9338871Z Setting up libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:52.9408849Z Setting up libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T05:03:52.9481665Z Setting up libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T05:03:52.9568655Z Setting up libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:52.9632388Z Setting up libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T05:03:52.9702860Z Setting up libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T05:03:52.9795984Z Setting up fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T05:03:52.9910894Z Setting up libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:52.9982563Z Setting up libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.0067802Z Setting up libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T05:03:53.0210551Z Setting up fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T05:03:53.0465007Z Setting up fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T05:03:53.0549202Z Setting up xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T05:03:53.0639844Z Setting up libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T05:03:53.0711247Z Setting up libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T05:03:53.0796392Z Setting up libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.0871074Z Setting up libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T05:03:53.0942314Z Setting up libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T05:03:53.1010849Z Setting up libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T05:03:53.1093932Z Setting up fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T05:03:53.1178299Z Setting up libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T05:03:53.1258833Z Setting up libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T05:03:53.1327029Z Setting up libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.1402893Z Setting up libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:53.1475400Z Setting up libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.1549982Z Setting up xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.1616908Z Setting up libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T05:03:53.1668661Z Setting up libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T05:03:53.1727747Z Setting up libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T05:03:53.1793936Z Setting up libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.1856188Z Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T05:03:53.2073121Z update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
|
|
||||||
2026-06-27T05:03:53.2107901Z Setting up libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T05:03:53.2165250Z Setting up at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.2215812Z Setting up libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.2268002Z Setting up fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T05:03:53.2318805Z Setting up libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T05:03:53.2385784Z Setting up libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.2443586Z Setting up libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T05:03:53.2495177Z Setting up libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T05:03:53.2540745Z Setting up libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T05:03:53.2591392Z Setting up fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T05:03:53.2638764Z Setting up libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.2708443Z Setting up libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.2757349Z Setting up x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T05:03:53.2822521Z Setting up libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:53.2890748Z Setting up libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T05:03:53.2977276Z Setting up xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T05:03:53.3135746Z Setting up libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.3206842Z Setting up xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T05:03:53.3259026Z Setting up xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T05:03:53.3725744Z Setting up xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T05:03:53.3818480Z Setting up libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T05:03:53.3887391Z Setting up xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T05:03:53.4263794Z Setting up libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.4322346Z Setting up libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.4391676Z Setting up libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.4462126Z Setting up libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T05:03:53.4549378Z Setting up mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.4613960Z Setting up libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.4687587Z Setting up libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.4921499Z Setting up libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T05:03:53.5016856Z Setting up libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.5076887Z Setting up libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T05:03:53.5129183Z Setting up xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T05:03:53.5186300Z Processing triggers for fontconfig (2.15.0-1.1ubuntu2) ...
|
|
||||||
2026-06-27T05:03:53.7260655Z Processing triggers for libc-bin (2.39-0ubuntu8.7) ...
|
|
||||||
2026-06-27T05:03:54.1068348Z Downloading Chromium 143.0.7499.4 (playwright build v1200) from https://cdn.playwright.dev/dbazure/download/playwright/builds/chromium/1200/chromium-linux.zip
|
|
||||||
2026-06-27T05:03:54.5570142Z | | 0% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:55.1093456Z |■■■■■■■■ | 10% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:55.5031508Z |■■■■■■■■■■■■■■■■ | 20% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:55.9123257Z |■■■■■■■■■■■■■■■■■■■■■■■■ | 30% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:56.3075780Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 40% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:56.7004190Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 50% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:57.1010194Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 60% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:57.5039906Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 70% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:57.8972893Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 80% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:58.3006030Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 90% of 164.7 MiB
|
|
||||||
2026-06-27T05:03:58.6921624Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 100% of 164.7 MiB
|
|
||||||
2026-06-27T05:04:02.3398057Z Chromium 143.0.7499.4 (playwright build v1200) downloaded to /root/.cache/ms-playwright/chromium-1200
|
|
||||||
2026-06-27T05:04:02.3398756Z Downloading FFMPEG playwright build v1011 from https://cdn.playwright.dev/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-linux.zip
|
|
||||||
2026-06-27T05:04:02.6712527Z | | 0% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.6774944Z |■■■■■■■■ | 10% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7588604Z |■■■■■■■■■■■■■■■■ | 20% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7589165Z |■■■■■■■■■■■■■■■■■■■■■■■■ | 30% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7589394Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 40% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7589602Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 50% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7589781Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 60% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7589890Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 70% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7590045Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 80% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7590154Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 90% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7590377Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 100% of 2.3 MiB
|
|
||||||
2026-06-27T05:04:02.7834173Z FFMPEG playwright build v1011 downloaded to /root/.cache/ms-playwright/ffmpeg-1011
|
|
||||||
2026-06-27T05:04:02.7836024Z Downloading Chromium Headless Shell 143.0.7499.4 (playwright build v1200) from https://cdn.playwright.dev/dbazure/download/playwright/builds/chromium/1200/chromium-headless-shell-linux.zip
|
|
||||||
2026-06-27T05:04:03.2976891Z | | 0% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:04.2033593Z |■■■■■■■■ | 10% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:04.5078388Z |■■■■■■■■■■■■■■■■ | 20% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:04.7311571Z |■■■■■■■■■■■■■■■■■■■■■■■■ | 30% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:05.0189698Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 40% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:05.2693267Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 50% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:05.5555251Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 60% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:05.8546832Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 70% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:06.0755813Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 80% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:06.3443369Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ | 90% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:06.6148896Z |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 100% of 109.7 MiB
|
|
||||||
2026-06-27T05:04:09.9767159Z Chromium Headless Shell 143.0.7499.4 (playwright build v1200) downloaded to /root/.cache/ms-playwright/chromium_headless_shell-1200
|
|
||||||
2026-06-27T05:04:10.6540019Z ::group::Run set -e
|
|
||||||
2026-06-27T05:04:10.6540361Z set -e
|
|
||||||
2026-06-27T05:04:10.6540468Z for i in $(seq 1 30); do
|
|
||||||
2026-06-27T05:04:10.6540553Z if curl -fsS "http://${DEPLOY_HOST}/taxbaik/healthz" >/dev/null; then
|
|
||||||
2026-06-27T05:04:10.6540669Z exit 0
|
|
||||||
2026-06-27T05:04:10.6540751Z fi
|
|
||||||
2026-06-27T05:04:10.6540818Z sleep 10
|
|
||||||
2026-06-27T05:04:10.6540886Z done
|
|
||||||
2026-06-27T05:04:10.6540950Z echo "Deployment did not become healthy in time" >&2
|
|
||||||
2026-06-27T05:04:10.6541033Z exit 1
|
|
||||||
2026-06-27T05:04:10.6541115Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T05:04:10.6541214Z env:
|
|
||||||
2026-06-27T05:04:10.6541289Z DEPLOY_HOST: ***
|
|
||||||
2026-06-27T05:04:10.6541370Z ::endgroup::
|
|
||||||
2026-06-27T05:04:10.9150473Z ::group::Run npm run test:e2e
|
|
||||||
2026-06-27T05:04:10.9150794Z npm run test:e2e
|
|
||||||
2026-06-27T05:04:10.9150903Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T05:04:10.9151028Z env:
|
|
||||||
2026-06-27T05:04:10.9151124Z E2E_BASE_URL: http://***/taxbaik
|
|
||||||
2026-06-27T05:04:10.9151217Z E2E_ADMIN_USERNAME: admin
|
|
||||||
2026-06-27T05:04:10.9151294Z E2E_ADMIN_PASSWORD: ***
|
|
||||||
2026-06-27T05:04:10.9151377Z ::endgroup::
|
|
||||||
2026-06-27T05:04:11.2860195Z
|
|
||||||
2026-06-27T05:04:11.2861110Z > test:e2e
|
|
||||||
2026-06-27T05:04:11.2861247Z > playwright test
|
|
||||||
2026-06-27T05:04:11.2861340Z
|
|
||||||
2026-06-27T05:04:13.6416816Z
|
|
||||||
2026-06-27T05:04:13.6417420Z Running 1 test using 1 worker
|
|
||||||
2026-06-27T05:04:13.6436531Z
|
|
||||||
2026-06-27T05:04:28.4679324Z ✘ 1 [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard (12.6s)
|
|
||||||
2026-06-27T05:04:41.9089406Z ✘ 2 [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard (retry #1) (11.6s)
|
|
||||||
2026-06-27T05:04:41.9615478Z
|
|
||||||
2026-06-27T05:04:41.9618838Z
|
|
||||||
2026-06-27T05:04:41.9638528Z 1) [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard
|
|
||||||
2026-06-27T05:04:41.9639391Z
|
|
||||||
2026-06-27T05:04:41.9639951Z Error: [2mexpect([22m[31mpage[39m[2m).[22mtoHaveURL[2m([22m[32mexpected[39m[2m)[22m failed
|
|
||||||
2026-06-27T05:04:41.9640306Z
|
|
||||||
2026-06-27T05:04:41.9640466Z Expected pattern: [32m/\/taxbaik\/admin\/dashboard$/[39m
|
|
||||||
2026-06-27T05:04:41.9640644Z Received string: [31m"http://***/taxbaik/admin/login"[39m
|
|
||||||
2026-06-27T05:04:41.9640835Z Timeout: 10000ms
|
|
||||||
2026-06-27T05:04:41.9640981Z
|
|
||||||
2026-06-27T05:04:41.9641052Z Call log:
|
|
||||||
2026-06-27T05:04:41.9641138Z [2m - Expect "toHaveURL" with timeout 10000ms[22m
|
|
||||||
2026-06-27T05:04:41.9641227Z [2m 14 × unexpected value "http://***/taxbaik/admin/login"[22m
|
|
||||||
2026-06-27T05:04:41.9641335Z
|
|
||||||
2026-06-27T05:04:41.9641420Z
|
|
||||||
2026-06-27T05:04:41.9641566Z 26 | await page.getByRole('button', { name: '로그인' }).click();
|
|
||||||
2026-06-27T05:04:41.9641779Z 27 |
|
|
||||||
2026-06-27T05:04:41.9641881Z > 28 | await expect(page).toHaveURL(/\/taxbaik\/admin\/dashboard$/);
|
|
||||||
2026-06-27T05:04:41.9641970Z | ^
|
|
||||||
2026-06-27T05:04:41.9642044Z 29 | await expect(page.getByRole('heading', { name: /대시보드/ })).toBeVisible();
|
|
||||||
2026-06-27T05:04:41.9642146Z 30 | await expect(page.getByRole('link', { name: /로그아웃/ })).toBeVisible();
|
|
||||||
2026-06-27T05:04:41.9642232Z 31 |
|
|
||||||
2026-06-27T05:04:41.9642317Z at /workspace/***/taxbaik/tests/e2e/admin-login.spec.ts:28:24
|
|
||||||
2026-06-27T05:04:41.9642473Z
|
|
||||||
2026-06-27T05:04:41.9642601Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9642789Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium/test-failed-1.png
|
|
||||||
2026-06-27T05:04:41.9642883Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9643008Z
|
|
||||||
2026-06-27T05:04:41.9643083Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9643198Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium/video.webm
|
|
||||||
2026-06-27T05:04:41.9643315Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9643506Z
|
|
||||||
2026-06-27T05:04:41.9643663Z Error Context: test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium/error-context.md
|
|
||||||
2026-06-27T05:04:41.9643843Z
|
|
||||||
2026-06-27T05:04:41.9643972Z attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9644106Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium/trace.zip
|
|
||||||
2026-06-27T05:04:41.9644193Z Usage:
|
|
||||||
2026-06-27T05:04:41.9644270Z
|
|
||||||
2026-06-27T05:04:41.9644338Z npx playwright show-trace test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium/trace.zip
|
|
||||||
2026-06-27T05:04:41.9644436Z
|
|
||||||
2026-06-27T05:04:41.9644504Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9644670Z
|
|
||||||
2026-06-27T05:04:41.9644798Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9644983Z
|
|
||||||
2026-06-27T05:04:41.9645104Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T05:04:41.9645192Z
|
|
||||||
2026-06-27T05:04:41.9645258Z Locator: getByRole('heading', { name: '관리자 로그인' })
|
|
||||||
2026-06-27T05:04:41.9645354Z Expected: visible
|
|
||||||
2026-06-27T05:04:41.9645427Z Timeout: 10000ms
|
|
||||||
2026-06-27T05:04:41.9645500Z Error: element(s) not found
|
|
||||||
2026-06-27T05:04:41.9645626Z
|
|
||||||
2026-06-27T05:04:41.9645757Z Call log:
|
|
||||||
2026-06-27T05:04:41.9645890Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T05:04:41.9645980Z [2m - waiting for getByRole('heading', { name: '관리자 로그인' })[22m
|
|
||||||
2026-06-27T05:04:41.9646211Z
|
|
||||||
2026-06-27T05:04:41.9646280Z
|
|
||||||
2026-06-27T05:04:41.9646372Z 21 | await page.goto(`${baseUrl}/admin/login`);
|
|
||||||
2026-06-27T05:04:41.9646455Z 22 |
|
|
||||||
2026-06-27T05:04:41.9646607Z > 23 | await expect(page.getByRole('heading', { name: '관리자 로그인' })).toBeVisible();
|
|
||||||
2026-06-27T05:04:41.9646775Z | ^
|
|
||||||
2026-06-27T05:04:41.9646911Z 24 | await page.getByRole('textbox', { name: '사용자명' }).fill(username);
|
|
||||||
2026-06-27T05:04:41.9647007Z 25 | await page.getByRole('textbox', { name: '비밀번호' }).fill(password);
|
|
||||||
2026-06-27T05:04:41.9647090Z 26 | await page.getByRole('button', { name: '로그인' }).click();
|
|
||||||
2026-06-27T05:04:41.9647171Z at /workspace/***/taxbaik/tests/e2e/admin-login.spec.ts:23:66
|
|
||||||
2026-06-27T05:04:41.9647259Z
|
|
||||||
2026-06-27T05:04:41.9647345Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9647447Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T05:04:41.9647702Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9647821Z
|
|
||||||
2026-06-27T05:04:41.9647885Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9647997Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium-retry1/video.webm
|
|
||||||
2026-06-27T05:04:41.9648081Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9648212Z
|
|
||||||
2026-06-27T05:04:41.9648277Z Error Context: test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium-retry1/error-context.md
|
|
||||||
2026-06-27T05:04:41.9648360Z
|
|
||||||
2026-06-27T05:04:41.9648426Z attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9648536Z test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T05:04:41.9648620Z Usage:
|
|
||||||
2026-06-27T05:04:41.9648684Z
|
|
||||||
2026-06-27T05:04:41.9648761Z npx playwright show-trace test-results/admin-login-admin-authenti-8d2e4-er-UI-and-reaches-dashboard-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T05:04:41.9648847Z
|
|
||||||
2026-06-27T05:04:41.9648922Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T05:04:41.9649026Z
|
|
||||||
2026-06-27T05:04:41.9649102Z 1 failed
|
|
||||||
2026-06-27T05:04:41.9649209Z [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard
|
|
||||||
2026-06-27T05:04:42.0225416Z ❌ Failure - Main Browser E2E verification
|
|
||||||
2026-06-27T05:04:42.0434087Z exitcode '1': failure
|
|
||||||
2026-06-27T05:04:42.0883354Z expression '${{ runner.os }}-playwright-\n' rewritten to 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T05:04:42.0883694Z evaluating expression 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T05:04:42.0883995Z expression 'format('{0}-playwright-\n', runner.os)' evaluated to '%!t(string=Linux-playwright-\n)'
|
|
||||||
2026-06-27T05:04:42.0884230Z expression '${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}' rewritten to 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T05:04:42.0884339Z evaluating expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T05:04:42.0884611Z Writing entry to tarball workflow/hashfiles/index.js len:168437
|
|
||||||
2026-06-27T05:04:42.0893475Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T05:04:42.0940280Z 🐳 docker exec cmd=[node /var/run/act/workflow/hashfiles/index.js] user= workdir=
|
|
||||||
2026-06-27T05:04:42.0940720Z Exec command '[node /var/run/act/workflow/hashfiles/index.js]'
|
|
||||||
2026-06-27T05:04:42.0940992Z Working directory '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T05:04:42.2624922Z expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))' evaluated to '%!t(string=Linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f)'
|
|
||||||
2026-06-27T05:04:42.2729036Z evaluating expression 'success()'
|
|
||||||
2026-06-27T05:04:42.2729591Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T05:04:42.2729747Z Skipping step 'Cache Playwright browsers' due to 'success()'
|
|
||||||
2026-06-27T05:04:42.3036579Z evaluating expression 'success()'
|
|
||||||
2026-06-27T05:04:42.3037200Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T05:04:42.3037410Z Skipping step 'Setup Node.js' due to 'success()'
|
|
||||||
2026-06-27T05:04:42.3364196Z evaluating expression 'always()'
|
|
||||||
2026-06-27T05:04:42.3364766Z expression 'always()' evaluated to 'true'
|
|
||||||
2026-06-27T05:04:42.3364912Z ⭐ Run Post Checkout code
|
|
||||||
2026-06-27T05:04:42.3365128Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T05:04:42.3365282Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T05:04:42.3365379Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T05:04:42.3365477Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T05:04:42.3365590Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T05:04:42.3365680Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T05:04:42.3429416Z run post step for 'Checkout code'
|
|
||||||
2026-06-27T05:04:42.3430373Z executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]
|
|
||||||
2026-06-27T05:04:42.3859083Z 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir=
|
|
||||||
2026-06-27T05:04:42.3859445Z Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]'
|
|
||||||
2026-06-27T05:04:42.3859861Z Working directory '/workspace/***/taxbaik'
|
|
||||||
-1018
File diff suppressed because it is too large
Load Diff
-932
@@ -1,932 +0,0 @@
|
|||||||
2026-06-27T12:24:54.5348434Z hz-prod-runner(version:v0.6.1) received task 262 of job browser-e2e, be triggered by event: push
|
|
||||||
2026-06-27T12:24:54.5361360Z workflow prepared
|
|
||||||
2026-06-27T12:24:54.5364384Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:24:54.5365287Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T12:24:54.5365673Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:24:54.5466861Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T12:24:54.5467110Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:24:54.5787535Z Image exists? true
|
|
||||||
2026-06-27T12:24:54.6291416Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:24:54.7978869Z Created container name=GITEA-ACTIONS-TASK-262-WORKFLOW-TaxBaik-Browser-E2E-JOB-browser-f5d6a3311b3836e51d8fb585a7d6b2a913d48f0455a2a7191285e8b859148f2b id=6a96f281e4aae9be735d17fb93794315e3bc2b5ea755f51629ceeff0d2fa4945 from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T12:24:54.7979438Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T12:24:54.7979590Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:24:54.7979739Z Starting container: 6a96f281e4aae9be735d17fb93794315e3bc2b5ea755f51629ceeff0d2fa4945
|
|
||||||
2026-06-27T12:24:54.9636529Z Started container: 6a96f281e4aae9be735d17fb93794315e3bc2b5ea755f51629ceeff0d2fa4945
|
|
||||||
2026-06-27T12:24:55.1013794Z Writing entry to tarball workflow/event.json len:4960
|
|
||||||
2026-06-27T12:24:55.1014599Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:24:55.1014906Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T12:24:55.1349772Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T12:24:55.1350311Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:24:55.6427083Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T12:24:55.6427583Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:24:55.6508054Z Checked out v4
|
|
||||||
2026-06-27T12:24:55.6607650Z ☁ git clone 'https://github.com/actions/setup-node' # ref=v4
|
|
||||||
2026-06-27T12:24:55.6607955Z cloning https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:24:56.2989902Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:24:56.2990509Z Cloned https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:24:56.3201201Z Checked out v4
|
|
||||||
2026-06-27T12:24:56.3298756Z ☁ git clone 'https://github.com/actions/cache' # ref=v4
|
|
||||||
2026-06-27T12:24:56.3299299Z cloning https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:24:57.0167124Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:24:57.0167917Z Cloned https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:24:57.0373085Z Checked out v4
|
|
||||||
2026-06-27T12:24:57.0765339Z evaluating expression ''
|
|
||||||
2026-06-27T12:24:57.0765988Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T12:24:57.0767113Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T12:24:57.0767300Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:24:57.0767450Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:24:57.0767551Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:24:57.0767635Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:24:57.0767716Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:24:57.0767816Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:24:57.0815444Z ::group::Run Checkout code
|
|
||||||
2026-06-27T12:24:57.6383705Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T12:24:57.6390917Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T12:24:57.6397276Z ::group::Getting Git version info
|
|
||||||
2026-06-27T12:24:57.6400204Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:24:57.6454189Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T12:24:57.6510122Z git version 2.54.0
|
|
||||||
2026-06-27T12:24:57.6563708Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.6588064Z Temporarily overriding HOME='/tmp/f6b17812-4704-4d0b-a03f-1993460e77fb' before making global git config changes
|
|
||||||
2026-06-27T12:24:57.6590799Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T12:24:57.6600727Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:24:57.6670777Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:24:57.6683421Z ::group::Initializing the repository
|
|
||||||
2026-06-27T12:24:57.6702745Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:24:57.6752430Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T12:24:57.6752949Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T12:24:57.6753077Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T12:24:57.6753235Z hint: call:
|
|
||||||
2026-06-27T12:24:57.6753317Z hint:
|
|
||||||
2026-06-27T12:24:57.6753406Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T12:24:57.6753507Z hint:
|
|
||||||
2026-06-27T12:24:57.6753576Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T12:24:57.6753661Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T12:24:57.6753744Z hint:
|
|
||||||
2026-06-27T12:24:57.6753844Z hint: git branch -m <name>
|
|
||||||
2026-06-27T12:24:57.6753912Z hint:
|
|
||||||
2026-06-27T12:24:57.6753989Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T12:24:57.6754077Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T12:24:57.6784028Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:24:57.6834723Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.6834987Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T12:24:57.6849923Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T12:24:57.6896730Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.6896969Z ::group::Setting up auth
|
|
||||||
2026-06-27T12:24:57.6903514Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T12:24:57.6950964Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T12:24:57.7288288Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T12:24:57.7335736Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T12:24:57.7764744Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T12:24:57.7798993Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T12:24:57.8039630Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T12:24:57.8087518Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.8087711Z ::group::Fetching the repository
|
|
||||||
2026-06-27T12:24:57.8087805Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +9f7e01652d8eaef9268ba463edc7ccb9f87288f3:refs/remotes/origin/master
|
|
||||||
2026-06-27T12:24:57.9043136Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:24:57.9043883Z * [new ref] 9f7e01652d8eaef9268ba463edc7ccb9f87288f3 -> origin/master
|
|
||||||
2026-06-27T12:24:57.9093179Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.9093547Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T12:24:57.9093806Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.9104830Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T12:24:57.9152785Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T12:24:57.9188914Z ::group::Checking out the ref
|
|
||||||
2026-06-27T12:24:57.9195755Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T12:24:57.9306875Z Reset branch 'master'
|
|
||||||
2026-06-27T12:24:57.9311676Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T12:24:57.9323309Z ::endgroup::
|
|
||||||
2026-06-27T12:24:57.9373935Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T12:24:57.9399904Z 9f7e01652d8eaef9268ba463edc7ccb9f87288f3
|
|
||||||
2026-06-27T12:24:57.9418995Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T12:24:57.9510963Z ::endgroup::
|
|
||||||
2026-06-27T12:24:58.0339931Z ::group::Run Setup Node.js
|
|
||||||
2026-06-27T12:24:58.0340296Z with:
|
|
||||||
2026-06-27T12:24:58.0340412Z cache: npm
|
|
||||||
2026-06-27T12:24:58.0340507Z node-version: 22
|
|
||||||
2026-06-27T12:24:58.9454536Z Found in cache @ /opt/hostedtoolcache/node/22.23.1/x64
|
|
||||||
2026-06-27T12:24:58.9463974Z (node:142) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:24:58.9464215Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:24:58.9484091Z ::group::Environment details
|
|
||||||
2026-06-27T12:24:59.1040681Z node: v22.23.1
|
|
||||||
2026-06-27T12:24:59.1041297Z npm: 10.9.8
|
|
||||||
2026-06-27T12:24:59.1041497Z yarn:
|
|
||||||
2026-06-27T12:24:59.1042193Z ::endgroup::
|
|
||||||
2026-06-27T12:24:59.1073895Z [command]/opt/hostedtoolcache/node/22.23.1/x64/bin/npm config get cache
|
|
||||||
2026-06-27T12:24:59.2253589Z /root/.npm
|
|
||||||
2026-06-27T12:24:59.2847981Z Cache Size: ~3 MB (2871987 B)
|
|
||||||
2026-06-27T12:24:59.2874913Z [command]/usr/bin/tar -xf /tmp/091e3aae-a4ba-413c-8154-9b1d3ed41ae0/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:24:59.3014463Z Cache restored successfully
|
|
||||||
2026-06-27T12:24:59.3024342Z Cache restored from key: node-cache-linux-x64-npm-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:24:59.3027864Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/tsc.json
|
|
||||||
2026-06-27T12:24:59.3028794Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-stylish.json
|
|
||||||
2026-06-27T12:24:59.3029483Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-compact.json
|
|
||||||
2026-06-27T12:24:59.3156762Z ::endgroup::
|
|
||||||
2026-06-27T12:24:59.5259797Z ::group::Run Cache Playwright browsers
|
|
||||||
2026-06-27T12:24:59.5260261Z with:
|
|
||||||
2026-06-27T12:24:59.5260382Z key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
|
||||||
2026-06-27T12:24:59.5260547Z path: ~/.cache/ms-playwright
|
|
||||||
2026-06-27T12:24:59.5261048Z restore-keys: ${{ runner.os }}-playwright-
|
|
||||||
2026-06-27T12:25:00.3828321Z (node:204) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:25:00.3829203Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:25:01.3019019Z Cache Size: ~247 MB (259204371 B)
|
|
||||||
2026-06-27T12:25:01.3155235Z [command]/usr/bin/tar -xf /tmp/5a591f39-ffb7-4ddb-8cb9-ba4eea78b8a0/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:25:02.9769632Z Cache restored successfully
|
|
||||||
2026-06-27T12:25:03.0033921Z Cache restored from key: linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:25:03.0216544Z ::endgroup::
|
|
||||||
2026-06-27T12:25:03.1500849Z ::group::Run set -e
|
|
||||||
2026-06-27T12:25:03.1501184Z set -e
|
|
||||||
2026-06-27T12:25:03.1501303Z npm ci
|
|
||||||
2026-06-27T12:25:03.1501394Z npx playwright install chromium --with-deps
|
|
||||||
2026-06-27T12:25:03.1501542Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:25:03.1501642Z ::endgroup::
|
|
||||||
2026-06-27T12:25:04.4857006Z
|
|
||||||
2026-06-27T12:25:04.4857770Z added 3 packages, and audited 4 packages in 1s
|
|
||||||
2026-06-27T12:25:04.4859161Z
|
|
||||||
2026-06-27T12:25:04.4859432Z found 0 vulnerabilities
|
|
||||||
2026-06-27T12:25:06.1025784Z Installing dependencies...
|
|
||||||
2026-06-27T12:25:06.5962559Z Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
|
|
||||||
2026-06-27T12:25:06.5963153Z Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
|
|
||||||
2026-06-27T12:25:06.7329817Z Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
|
|
||||||
2026-06-27T12:25:06.7551167Z Get:4 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B]
|
|
||||||
2026-06-27T12:25:06.7898601Z Get:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
|
|
||||||
2026-06-27T12:25:06.7915103Z Get:6 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble InRelease [24.3 kB]
|
|
||||||
2026-06-27T12:25:06.8012924Z Get:7 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [43.8 kB]
|
|
||||||
2026-06-27T12:25:06.8522335Z Get:8 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1487 kB]
|
|
||||||
2026-06-27T12:25:06.9084619Z Get:9 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [1339 kB]
|
|
||||||
2026-06-27T12:25:06.9421547Z Get:10 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [976 kB]
|
|
||||||
2026-06-27T12:25:07.0208068Z Get:11 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
|
|
||||||
2026-06-27T12:25:07.4083227Z Get:12 https://packagecloud.io/github/git-lfs/ubuntu noble InRelease [29.2 kB]
|
|
||||||
2026-06-27T12:25:07.5452616Z Get:13 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
|
|
||||||
2026-06-27T12:25:07.5516482Z Get:14 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
|
|
||||||
2026-06-27T12:25:07.5568467Z Get:15 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
|
|
||||||
2026-06-27T12:25:07.5770548Z Get:16 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [1412 kB]
|
|
||||||
2026-06-27T12:25:07.5971965Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1296 kB]
|
|
||||||
2026-06-27T12:25:07.6081367Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [49.5 kB]
|
|
||||||
2026-06-27T12:25:07.6108400Z Get:19 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [2108 kB]
|
|
||||||
2026-06-27T12:25:07.7011339Z Get:20 https://packages.microsoft.com/ubuntu/24.04/prod noble/main all Packages [643 B]
|
|
||||||
2026-06-27T12:25:07.7073375Z Get:21 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [187 kB]
|
|
||||||
2026-06-27T12:25:07.8212545Z Get:22 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [35.9 kB]
|
|
||||||
2026-06-27T12:25:07.8429172Z Get:23 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [48.9 kB]
|
|
||||||
2026-06-27T12:25:07.8474967Z Get:24 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Packages [671 B]
|
|
||||||
2026-06-27T12:25:08.0103366Z Get:25 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble/main amd64 Packages [2988 B]
|
|
||||||
2026-06-27T12:25:08.8441365Z Get:26 https://packagecloud.io/github/git-lfs/ubuntu noble/main amd64 Packages [1273 B]
|
|
||||||
2026-06-27T12:25:09.1241906Z Fetched 31.3 MB in 3s (10.7 MB/s)
|
|
||||||
2026-06-27T12:25:10.5360575Z Reading package lists...
|
|
||||||
2026-06-27T12:25:12.2698618Z Reading package lists...
|
|
||||||
2026-06-27T12:25:12.6910492Z Building dependency tree...
|
|
||||||
2026-06-27T12:25:12.6917607Z Reading state information...
|
|
||||||
2026-06-27T12:25:13.1858629Z libcairo2 is already the newest version (1.18.0-3build1).
|
|
||||||
2026-06-27T12:25:13.1859112Z libcairo2 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1859229Z libdbus-1-3 is already the newest version (1.14.10-4ubuntu4.1).
|
|
||||||
2026-06-27T12:25:13.1859435Z libdbus-1-3 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1859522Z libglib2.0-0t64 is already the newest version (2.80.0-6ubuntu3.8).
|
|
||||||
2026-06-27T12:25:13.1859639Z libglib2.0-0t64 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1859791Z libpango-1.0-0 is already the newest version (1.52.1+ds-1build1).
|
|
||||||
2026-06-27T12:25:13.1859900Z libpango-1.0-0 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1859977Z libx11-6 is already the newest version (2:1.8.7-1build1).
|
|
||||||
2026-06-27T12:25:13.1860055Z libx11-6 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1860147Z libxcb1 is already the newest version (1.15-1ubuntu2).
|
|
||||||
2026-06-27T12:25:13.1860224Z libxcb1 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1860299Z libxext6 is already the newest version (2:1.3.4-1build2).
|
|
||||||
2026-06-27T12:25:13.1860399Z libxext6 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1860475Z libfontconfig1 is already the newest version (2.15.0-1.1ubuntu2).
|
|
||||||
2026-06-27T12:25:13.1860556Z libfontconfig1 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1860640Z libfreetype6 is already the newest version (2.13.2+dfsg-1ubuntu0.1).
|
|
||||||
2026-06-27T12:25:13.1860746Z libfreetype6 set to manually installed.
|
|
||||||
2026-06-27T12:25:13.1860824Z The following additional packages will be installed:
|
|
||||||
2026-06-27T12:25:13.1860920Z at-spi2-common libasound2-data libavahi-client3 libavahi-common-data
|
|
||||||
2026-06-27T12:25:13.1861019Z libavahi-common3 libdrm-amdgpu1 libdrm-common libdrm-intel1 libfontenc1
|
|
||||||
2026-06-27T12:25:13.1861099Z libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:25:13.1862774Z libpciaccess0 libsensors-config libsensors5 libvulkan1 libx11-xcb1 libxaw7
|
|
||||||
2026-06-27T12:25:13.1863103Z libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-sync1
|
|
||||||
2026-06-27T12:25:13.1863512Z libxcb-xfixes0 libxfont2 libxi6 libxkbfile1 libxmu6 libxmuu1 libxpm4
|
|
||||||
2026-06-27T12:25:13.1864703Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:25:13.1864901Z xfonts-encodings xfonts-utils xkb-data xserver-common
|
|
||||||
2026-06-27T12:25:13.1887405Z Suggested packages:
|
|
||||||
2026-06-27T12:25:13.1887786Z alsa-utils libasound2-plugins cups-common pciutils lm-sensors
|
|
||||||
2026-06-27T12:25:13.1887898Z Recommended packages:
|
|
||||||
2026-06-27T12:25:13.1887986Z fonts-ipafont-mincho fonts-liberation-sans-narrow fonts-tlwg-loma
|
|
||||||
2026-06-27T12:25:13.1888398Z alsa-ucm-conf alsa-topology-conf at-spi2-core mesa-vulkan-drivers
|
|
||||||
2026-06-27T12:25:13.1888525Z | vulkan-icd xfonts-base
|
|
||||||
2026-06-27T12:25:13.4376794Z The following NEW packages will be installed:
|
|
||||||
2026-06-27T12:25:13.4380936Z at-spi2-common fonts-freefont-ttf fonts-ipafont-gothic fonts-liberation
|
|
||||||
2026-06-27T12:25:13.4387092Z fonts-noto-color-emoji fonts-tlwg-loma-otf fonts-unifont fonts-wqy-zenhei
|
|
||||||
2026-06-27T12:25:13.4388949Z libasound2-data libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64
|
|
||||||
2026-06-27T12:25:13.4391554Z libatspi2.0-0t64 libavahi-client3 libavahi-common-data libavahi-common3
|
|
||||||
2026-06-27T12:25:13.4394306Z libcups2t64 libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm2 libfontenc1
|
|
||||||
2026-06-27T12:25:13.4399560Z libgbm1 libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:25:13.4408211Z libnspr4 libnss3 libpciaccess0 libsensors-config libsensors5 libvulkan1
|
|
||||||
2026-06-27T12:25:13.4409722Z libx11-xcb1 libxaw7 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0
|
|
||||||
2026-06-27T12:25:13.4411093Z libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxdamage1 libxfixes3 libxfont2
|
|
||||||
2026-06-27T12:25:13.4412653Z libxi6 libxkbcommon0 libxkbfile1 libxmu6 libxmuu1 libxpm4 libxrandr2
|
|
||||||
2026-06-27T12:25:13.4422977Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:25:13.4424559Z xfonts-cyrillic xfonts-encodings xfonts-scalable xfonts-utils xkb-data
|
|
||||||
2026-06-27T12:25:13.4425990Z xserver-common xvfb
|
|
||||||
2026-06-27T12:25:13.5058139Z 0 upgraded, 66 newly installed, 0 to remove and 52 not upgraded.
|
|
||||||
2026-06-27T12:25:13.5058970Z Need to get 79.3 MB of archives.
|
|
||||||
2026-06-27T12:25:13.5059254Z After this operation, 303 MB of additional disk space will be used.
|
|
||||||
2026-06-27T12:25:13.5059497Z Get:1 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3513 kB]
|
|
||||||
2026-06-27T12:25:13.6237335Z Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xkb-data all 2.41-2ubuntu1.1 [397 kB]
|
|
||||||
2026-06-27T12:25:13.6297773Z Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-common all 2.4.125-1ubuntu0.1~24.04.2 [9250 B]
|
|
||||||
2026-06-27T12:25:13.6370981Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm2 amd64 2.4.125-1ubuntu0.1~24.04.2 [41.4 kB]
|
|
||||||
2026-06-27T12:25:13.6439924Z Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors-config all 1:3.6.0-9build1 [5546 B]
|
|
||||||
2026-06-27T12:25:13.6512980Z Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors5 amd64 1:3.6.0-9build1 [26.6 kB]
|
|
||||||
2026-06-27T12:25:13.6569963Z Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbcommon0 amd64 1.6.0-1build1 [122 kB]
|
|
||||||
2026-06-27T12:25:13.6642523Z Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmuu1 amd64 2:1.1.3-3build2 [8958 B]
|
|
||||||
2026-06-27T12:25:13.6717647Z Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 xauth amd64 1:1.1.2-1build1 [25.6 kB]
|
|
||||||
2026-06-27T12:25:13.6785307Z Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 at-spi2-common all 2.52.0-1build1 [8674 B]
|
|
||||||
2026-06-27T12:25:13.6862705Z Get:11 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-freefont-ttf all 20211204+svn4273-2 [5641 kB]
|
|
||||||
2026-06-27T12:25:13.7656370Z Get:12 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-liberation all 1:2.1.5-3 [1603 kB]
|
|
||||||
2026-06-27T12:25:13.7754341Z Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 fonts-noto-color-emoji all 2.047-0ubuntu0.24.04.1 [9764 kB]
|
|
||||||
2026-06-27T12:25:13.8489857Z Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-tlwg-loma-otf all 1:0.7.3-1 [107 kB]
|
|
||||||
2026-06-27T12:25:13.8520329Z Get:15 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-unifont all 1:15.1.01-1build1 [2993 kB]
|
|
||||||
2026-06-27T12:25:13.8791683Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-wqy-zenhei all 0.9.45-8 [7472 kB]
|
|
||||||
2026-06-27T12:25:13.9445545Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.2 [21.3 kB]
|
|
||||||
2026-06-27T12:25:13.9455241Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.2 [398 kB]
|
|
||||||
2026-06-27T12:25:13.9507365Z Get:19 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk1.0-0t64 amd64 2.52.0-1build1 [55.3 kB]
|
|
||||||
2026-06-27T12:25:13.9526368Z Get:20 http://archive.ubuntu.com/ubuntu noble/main amd64 libxi6 amd64 2:1.8.1-1build1 [32.4 kB]
|
|
||||||
2026-06-27T12:25:13.9534046Z Get:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libatspi2.0-0t64 amd64 2.52.0-1build1 [80.5 kB]
|
|
||||||
2026-06-27T12:25:13.9555904Z Get:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk-bridge2.0-0t64 amd64 2.52.0-1build1 [66.0 kB]
|
|
||||||
2026-06-27T12:25:13.9570240Z Get:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common-data amd64 0.8-13ubuntu6.2 [30.1 kB]
|
|
||||||
2026-06-27T12:25:13.9582290Z Get:24 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common3 amd64 0.8-13ubuntu6.2 [23.4 kB]
|
|
||||||
2026-06-27T12:25:13.9596720Z Get:25 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-client3 amd64 0.8-13ubuntu6.2 [26.8 kB]
|
|
||||||
2026-06-27T12:25:13.9658430Z Get:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcups2t64 amd64 2.4.7-1.2ubuntu7.14 [274 kB]
|
|
||||||
2026-06-27T12:25:13.9786888Z Get:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-amdgpu1 amd64 2.4.125-1ubuntu0.1~24.04.2 [21.4 kB]
|
|
||||||
2026-06-27T12:25:13.9845650Z Get:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpciaccess0 amd64 0.17-3ubuntu0.24.04.2 [18.9 kB]
|
|
||||||
2026-06-27T12:25:13.9889391Z Get:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-intel1 amd64 2.4.125-1ubuntu0.1~24.04.2 [63.9 kB]
|
|
||||||
2026-06-27T12:25:13.9956446Z Get:30 http://archive.ubuntu.com/ubuntu noble/main amd64 libfontenc1 amd64 1:1.1.8-1build1 [14.0 kB]
|
|
||||||
2026-06-27T12:25:14.0020494Z Get:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libllvm20 amd64 1:20.1.2-0ubuntu1~24.04.3 [30.6 MB]
|
|
||||||
2026-06-27T12:25:14.3512110Z Get:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-xcb1 amd64 2:1.8.7-1build1 [7800 B]
|
|
||||||
2026-06-27T12:25:14.3524568Z Get:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-dri3-0 amd64 1.15-1ubuntu2 [7142 B]
|
|
||||||
2026-06-27T12:25:14.3536276Z Get:34 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-present0 amd64 1.15-1ubuntu2 [5676 B]
|
|
||||||
2026-06-27T12:25:14.3540824Z Get:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-randr0 amd64 1.15-1ubuntu2 [17.9 kB]
|
|
||||||
2026-06-27T12:25:14.3630953Z Get:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-sync1 amd64 1.15-1ubuntu2 [9312 B]
|
|
||||||
2026-06-27T12:25:14.3643692Z Get:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-xfixes0 amd64 1.15-1ubuntu2 [10.2 kB]
|
|
||||||
2026-06-27T12:25:14.3644726Z Get:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libxshmfence1 amd64 1.3-1build5 [4764 B]
|
|
||||||
2026-06-27T12:25:14.3649363Z Get:39 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 mesa-libgallium amd64 25.2.8-0ubuntu0.24.04.2 [10.8 MB]
|
|
||||||
2026-06-27T12:25:14.4958716Z Get:40 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgbm1 amd64 25.2.8-0ubuntu0.24.04.2 [34.2 kB]
|
|
||||||
2026-06-27T12:25:14.4964971Z Get:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libvulkan1 amd64 1.3.275.0-1build1 [142 kB]
|
|
||||||
2026-06-27T12:25:14.4985248Z Get:42 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgl1-mesa-dri amd64 25.2.8-0ubuntu0.24.04.2 [37.9 kB]
|
|
||||||
2026-06-27T12:25:14.5001361Z Get:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-glx0 amd64 1.15-1ubuntu2 [24.8 kB]
|
|
||||||
2026-06-27T12:25:14.5002004Z Get:44 http://archive.ubuntu.com/ubuntu noble/main amd64 libxxf86vm1 amd64 1:1.1.4-1build4 [9282 B]
|
|
||||||
2026-06-27T12:25:14.5002482Z Get:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libglx-mesa0 amd64 25.2.8-0ubuntu0.24.04.2 [110 kB]
|
|
||||||
2026-06-27T12:25:14.5023508Z Get:46 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 [117 kB]
|
|
||||||
2026-06-27T12:25:14.5056546Z Get:47 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss3 amd64 2:3.98-1ubuntu0.1 [1445 kB]
|
|
||||||
2026-06-27T12:25:14.5135739Z Get:48 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmu6 amd64 2:1.1.3-3build2 [47.6 kB]
|
|
||||||
2026-06-27T12:25:14.5160172Z Get:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libxpm4 amd64 1:3.5.17-1build2 [36.5 kB]
|
|
||||||
2026-06-27T12:25:14.5362960Z Get:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libxaw7 amd64 2:1.0.14-1build2 [187 kB]
|
|
||||||
2026-06-27T12:25:14.5458048Z Get:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcomposite1 amd64 1:0.4.5-1build3 [6320 B]
|
|
||||||
2026-06-27T12:25:14.5533493Z Get:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libxdamage1 amd64 1:1.1.6-1build1 [6150 B]
|
|
||||||
2026-06-27T12:25:14.5625598Z Get:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfixes3 amd64 1:6.0.0-2build1 [10.8 kB]
|
|
||||||
2026-06-27T12:25:14.5697072Z Get:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfont2 amd64 1:2.0.6-1build1 [93.0 kB]
|
|
||||||
2026-06-27T12:25:14.5719456Z Get:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbfile1 amd64 1:1.1.0-1build4 [70.0 kB]
|
|
||||||
2026-06-27T12:25:14.5786293Z Get:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libxrandr2 amd64 2:1.5.2-2build1 [19.7 kB]
|
|
||||||
2026-06-27T12:25:14.5847022Z Get:57 http://archive.ubuntu.com/ubuntu noble/main amd64 x11-xkb-utils amd64 7.7+8build2 [170 kB]
|
|
||||||
2026-06-27T12:25:14.5928264Z Get:58 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 [578 kB]
|
|
||||||
2026-06-27T12:25:14.5996539Z Get:59 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-utils amd64 1:7.7+6build3 [94.4 kB]
|
|
||||||
2026-06-27T12:25:14.6067697Z Get:60 http://archive.ubuntu.com/ubuntu noble/universe amd64 xfonts-cyrillic all 1:1.0.5+nmu1 [384 kB]
|
|
||||||
2026-06-27T12:25:14.6128176Z Get:61 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-scalable all 1:1.0.3-1.3 [304 kB]
|
|
||||||
2026-06-27T12:25:14.6186928Z Get:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xserver-common all 2:21.1.12-1ubuntu1.6 [34.7 kB]
|
|
||||||
2026-06-27T12:25:14.6245655Z Get:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libglvnd0 amd64 1.7.0-1build1 [69.6 kB]
|
|
||||||
2026-06-27T12:25:14.6314597Z Get:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libglx0 amd64 1.7.0-1build1 [38.6 kB]
|
|
||||||
2026-06-27T12:25:14.6385550Z Get:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libgl1 amd64 1.7.0-1build1 [102 kB]
|
|
||||||
2026-06-27T12:25:14.6438583Z Get:66 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 xvfb amd64 2:21.1.12-1ubuntu1.6 [877 kB]
|
|
||||||
2026-06-27T12:25:15.1420657Z debconf: delaying package configuration, since apt-utils is not installed
|
|
||||||
2026-06-27T12:25:15.2108116Z Fetched 79.3 MB in 1s (66.5 MB/s)
|
|
||||||
2026-06-27T12:25:15.2544541Z Selecting previously unselected package fonts-ipafont-gothic.
|
|
||||||
2026-06-27T12:25:15.4019282Z (Reading database ...
|
|
||||||
(Reading database ... 5%
|
|
||||||
(Reading database ... 10%
|
|
||||||
(Reading database ... 15%
|
|
||||||
(Reading database ... 20%
|
|
||||||
(Reading database ... 25%
|
|
||||||
(Reading database ... 30%
|
|
||||||
(Reading database ... 35%
|
|
||||||
(Reading database ... 40%
|
|
||||||
(Reading database ... 45%
|
|
||||||
(Reading database ... 50%
|
|
||||||
(Reading database ... 55%
|
|
||||||
(Reading database ... 60%
|
|
||||||
(Reading database ... 65%
|
|
||||||
(Reading database ... 70%
|
|
||||||
(Reading database ... 75%
|
|
||||||
(Reading database ... 80%
|
|
||||||
(Reading database ... 85%
|
|
||||||
(Reading database ... 90%
|
|
||||||
(Reading database ... 95%
|
|
||||||
(Reading database ... 100%
|
|
||||||
(Reading database ... 26518 files and directories currently installed.)
|
|
||||||
2026-06-27T12:25:15.4039305Z Preparing to unpack .../00-fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
|
|
||||||
2026-06-27T12:25:15.4170596Z Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:25:15.7638590Z Selecting previously unselected package xkb-data.
|
|
||||||
2026-06-27T12:25:15.7665619Z Preparing to unpack .../01-xkb-data_2.41-2ubuntu1.1_all.deb ...
|
|
||||||
2026-06-27T12:25:15.7731200Z Unpacking xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:25:15.8783558Z Selecting previously unselected package libdrm-common.
|
|
||||||
2026-06-27T12:25:15.8872851Z Preparing to unpack .../02-libdrm-common_2.4.125-1ubuntu0.1~24.04.2_all.deb ...
|
|
||||||
2026-06-27T12:25:15.8934497Z Unpacking libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:15.9257959Z Selecting previously unselected package libdrm2:amd64.
|
|
||||||
2026-06-27T12:25:15.9258566Z Preparing to unpack .../03-libdrm2_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:15.9318366Z Unpacking libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:15.9578149Z Selecting previously unselected package libsensors-config.
|
|
||||||
2026-06-27T12:25:15.9619599Z Preparing to unpack .../04-libsensors-config_1%3a3.6.0-9build1_all.deb ...
|
|
||||||
2026-06-27T12:25:15.9655415Z Unpacking libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:25:15.9977899Z Selecting previously unselected package libsensors5:amd64.
|
|
||||||
2026-06-27T12:25:16.0018522Z Preparing to unpack .../05-libsensors5_1%3a3.6.0-9build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:16.0532739Z Unpacking libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:25:16.0808844Z Selecting previously unselected package libxkbcommon0:amd64.
|
|
||||||
2026-06-27T12:25:16.0845443Z Preparing to unpack .../06-libxkbcommon0_1.6.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:16.0892770Z Unpacking libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:25:16.1295934Z Selecting previously unselected package libxmuu1:amd64.
|
|
||||||
2026-06-27T12:25:16.1297484Z Preparing to unpack .../07-libxmuu1_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:16.1319959Z Unpacking libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:25:16.1798353Z Selecting previously unselected package xauth.
|
|
||||||
2026-06-27T12:25:16.1844381Z Preparing to unpack .../08-xauth_1%3a1.1.2-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:16.1873744Z Unpacking xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:25:16.2337376Z Selecting previously unselected package at-spi2-common.
|
|
||||||
2026-06-27T12:25:16.2374210Z Preparing to unpack .../09-at-spi2-common_2.52.0-1build1_all.deb ...
|
|
||||||
2026-06-27T12:25:16.2403654Z Unpacking at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:16.2640031Z Selecting previously unselected package fonts-freefont-ttf.
|
|
||||||
2026-06-27T12:25:16.2688194Z Preparing to unpack .../10-fonts-freefont-ttf_20211204+svn4273-2_all.deb ...
|
|
||||||
2026-06-27T12:25:16.2715634Z Unpacking fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:25:16.4624949Z Selecting previously unselected package fonts-liberation.
|
|
||||||
2026-06-27T12:25:16.4664412Z Preparing to unpack .../11-fonts-liberation_1%3a2.1.5-3_all.deb ...
|
|
||||||
2026-06-27T12:25:16.4698233Z Unpacking fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:25:16.5758532Z Selecting previously unselected package fonts-noto-color-emoji.
|
|
||||||
2026-06-27T12:25:16.5784846Z Preparing to unpack .../12-fonts-noto-color-emoji_2.047-0ubuntu0.24.04.1_all.deb ...
|
|
||||||
2026-06-27T12:25:16.5818431Z Unpacking fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:25:16.6688110Z Selecting previously unselected package fonts-tlwg-loma-otf.
|
|
||||||
2026-06-27T12:25:16.6697851Z Preparing to unpack .../13-fonts-tlwg-loma-otf_1%3a0.7.3-1_all.deb ...
|
|
||||||
2026-06-27T12:25:16.6728075Z Unpacking fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:25:16.7058383Z Selecting previously unselected package fonts-unifont.
|
|
||||||
2026-06-27T12:25:16.7076283Z Preparing to unpack .../14-fonts-unifont_1%3a15.1.01-1build1_all.deb ...
|
|
||||||
2026-06-27T12:25:16.7119785Z Unpacking fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:25:16.8738298Z Selecting previously unselected package fonts-wqy-zenhei.
|
|
||||||
2026-06-27T12:25:16.8754729Z Preparing to unpack .../15-fonts-wqy-zenhei_0.9.45-8_all.deb ...
|
|
||||||
2026-06-27T12:25:16.8864258Z Unpacking fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:25:17.7398488Z Selecting previously unselected package libasound2-data.
|
|
||||||
2026-06-27T12:25:17.7413325Z Preparing to unpack .../16-libasound2-data_1.2.11-1ubuntu0.2_all.deb ...
|
|
||||||
2026-06-27T12:25:17.7462092Z Unpacking libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:25:17.8189676Z Selecting previously unselected package libasound2t64:amd64.
|
|
||||||
2026-06-27T12:25:17.8228827Z Preparing to unpack .../17-libasound2t64_1.2.11-1ubuntu0.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:17.8271296Z Unpacking libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:25:17.8868281Z Selecting previously unselected package libatk1.0-0t64:amd64.
|
|
||||||
2026-06-27T12:25:17.8893786Z Preparing to unpack .../18-libatk1.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:17.8967249Z Unpacking libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:17.9469807Z Selecting previously unselected package libxi6:amd64.
|
|
||||||
2026-06-27T12:25:18.0106781Z Preparing to unpack .../19-libxi6_2%3a1.8.1-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.0150638Z Unpacking libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:25:18.0601129Z Selecting previously unselected package libatspi2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:25:18.0603195Z Preparing to unpack .../20-libatspi2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.0640403Z Unpacking libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:18.1577757Z Selecting previously unselected package libatk-bridge2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:25:18.1595179Z Preparing to unpack .../21-libatk-bridge2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.1634496Z Unpacking libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:18.1971550Z Selecting previously unselected package libavahi-common-data:amd64.
|
|
||||||
2026-06-27T12:25:18.2035440Z Preparing to unpack .../22-libavahi-common-data_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.2091156Z Unpacking libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:18.2980438Z Selecting previously unselected package libavahi-common3:amd64.
|
|
||||||
2026-06-27T12:25:18.3021286Z Preparing to unpack .../23-libavahi-common3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.3059229Z Unpacking libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:18.3489053Z Selecting previously unselected package libavahi-client3:amd64.
|
|
||||||
2026-06-27T12:25:18.3515870Z Preparing to unpack .../24-libavahi-client3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.3548912Z Unpacking libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:18.3938504Z Selecting previously unselected package libcups2t64:amd64.
|
|
||||||
2026-06-27T12:25:18.3954248Z Preparing to unpack .../25-libcups2t64_2.4.7-1.2ubuntu7.14_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.4013283Z Unpacking libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:25:18.4438106Z Selecting previously unselected package libdrm-amdgpu1:amd64.
|
|
||||||
2026-06-27T12:25:18.4452600Z Preparing to unpack .../26-libdrm-amdgpu1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.4488012Z Unpacking libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:18.4852562Z Selecting previously unselected package libpciaccess0:amd64.
|
|
||||||
2026-06-27T12:25:18.4871489Z Preparing to unpack .../27-libpciaccess0_0.17-3ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.4905191Z Unpacking libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:18.5257535Z Selecting previously unselected package libdrm-intel1:amd64.
|
|
||||||
2026-06-27T12:25:18.5331423Z Preparing to unpack .../28-libdrm-intel1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.5387663Z Unpacking libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:18.5829710Z Selecting previously unselected package libfontenc1:amd64.
|
|
||||||
2026-06-27T12:25:18.5830315Z Preparing to unpack .../29-libfontenc1_1%3a1.1.8-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.5871022Z Unpacking libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:25:18.6417563Z Selecting previously unselected package libllvm20:amd64.
|
|
||||||
2026-06-27T12:25:18.6492294Z Preparing to unpack .../30-libllvm20_1%3a20.1.2-0ubuntu1~24.04.3_amd64.deb ...
|
|
||||||
2026-06-27T12:25:18.6517213Z Unpacking libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:25:19.6509055Z Selecting previously unselected package libx11-xcb1:amd64.
|
|
||||||
2026-06-27T12:25:19.6530193Z Preparing to unpack .../31-libx11-xcb1_2%3a1.8.7-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.6572298Z Unpacking libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:25:19.7068262Z Selecting previously unselected package libxcb-dri3-0:amd64.
|
|
||||||
2026-06-27T12:25:19.7087732Z Preparing to unpack .../32-libxcb-dri3-0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.7122822Z Unpacking libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:19.7678827Z Selecting previously unselected package libxcb-present0:amd64.
|
|
||||||
2026-06-27T12:25:19.7709390Z Preparing to unpack .../33-libxcb-present0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.7772207Z Unpacking libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:19.8189165Z Selecting previously unselected package libxcb-randr0:amd64.
|
|
||||||
2026-06-27T12:25:19.8211057Z Preparing to unpack .../34-libxcb-randr0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.8288071Z Unpacking libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:19.8973149Z Selecting previously unselected package libxcb-sync1:amd64.
|
|
||||||
2026-06-27T12:25:19.9089508Z Preparing to unpack .../35-libxcb-sync1_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.9139345Z Unpacking libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:19.9519040Z Selecting previously unselected package libxcb-xfixes0:amd64.
|
|
||||||
2026-06-27T12:25:19.9540956Z Preparing to unpack .../36-libxcb-xfixes0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:19.9570911Z Unpacking libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:20.0108902Z Selecting previously unselected package libxshmfence1:amd64.
|
|
||||||
2026-06-27T12:25:20.0140100Z Preparing to unpack .../37-libxshmfence1_1.3-1build5_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.0206320Z Unpacking libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:25:20.1548281Z Selecting previously unselected package mesa-libgallium:amd64.
|
|
||||||
2026-06-27T12:25:20.1618136Z Preparing to unpack .../38-mesa-libgallium_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.1698135Z Unpacking mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:20.4349392Z Selecting previously unselected package libgbm1:amd64.
|
|
||||||
2026-06-27T12:25:20.4407367Z Preparing to unpack .../39-libgbm1_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.4451117Z Unpacking libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:20.4978734Z Selecting previously unselected package libvulkan1:amd64.
|
|
||||||
2026-06-27T12:25:20.5001435Z Preparing to unpack .../40-libvulkan1_1.3.275.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.5246522Z Unpacking libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:25:20.5783283Z Selecting previously unselected package libgl1-mesa-dri:amd64.
|
|
||||||
2026-06-27T12:25:20.5844389Z Preparing to unpack .../41-libgl1-mesa-dri_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.7319616Z Unpacking libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:20.8130736Z Selecting previously unselected package libxcb-glx0:amd64.
|
|
||||||
2026-06-27T12:25:20.8131331Z Preparing to unpack .../42-libxcb-glx0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.8131586Z Unpacking libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:20.9065341Z Selecting previously unselected package libxxf86vm1:amd64.
|
|
||||||
2026-06-27T12:25:20.9066406Z Preparing to unpack .../43-libxxf86vm1_1%3a1.1.4-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:25:20.9066603Z Unpacking libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:25:21.0178713Z Selecting previously unselected package libglx-mesa0:amd64.
|
|
||||||
2026-06-27T12:25:21.0201703Z Preparing to unpack .../44-libglx-mesa0_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.0304195Z Unpacking libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:21.1388779Z Selecting previously unselected package libnspr4:amd64.
|
|
||||||
2026-06-27T12:25:21.1403039Z Preparing to unpack .../45-libnspr4_2%3a4.35-1.1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.1503359Z Unpacking libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:25:21.2485005Z Selecting previously unselected package libnss3:amd64.
|
|
||||||
2026-06-27T12:25:21.2558864Z Preparing to unpack .../46-libnss3_2%3a3.98-1ubuntu0.1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.2597072Z Unpacking libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:25:21.3476375Z Selecting previously unselected package libxmu6:amd64.
|
|
||||||
2026-06-27T12:25:21.3537982Z Preparing to unpack .../47-libxmu6_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.3573745Z Unpacking libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:25:21.4067043Z Selecting previously unselected package libxpm4:amd64.
|
|
||||||
2026-06-27T12:25:21.4129723Z Preparing to unpack .../48-libxpm4_1%3a3.5.17-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.4177982Z Unpacking libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:25:21.4769218Z Selecting previously unselected package libxaw7:amd64.
|
|
||||||
2026-06-27T12:25:21.4818449Z Preparing to unpack .../49-libxaw7_2%3a1.0.14-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.4877720Z Unpacking libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:25:21.7198538Z Selecting previously unselected package libxcomposite1:amd64.
|
|
||||||
2026-06-27T12:25:21.7199108Z Preparing to unpack .../50-libxcomposite1_1%3a0.4.5-1build3_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.7226404Z Unpacking libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:25:21.7823786Z Selecting previously unselected package libxdamage1:amd64.
|
|
||||||
2026-06-27T12:25:21.7867778Z Preparing to unpack .../51-libxdamage1_1%3a1.1.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.7868282Z Unpacking libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:25:21.8388943Z Selecting previously unselected package libxfixes3:amd64.
|
|
||||||
2026-06-27T12:25:21.8430434Z Preparing to unpack .../52-libxfixes3_1%3a6.0.0-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.8508500Z Unpacking libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:25:21.9081558Z Selecting previously unselected package libxfont2:amd64.
|
|
||||||
2026-06-27T12:25:21.9083055Z Preparing to unpack .../53-libxfont2_1%3a2.0.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:21.9083343Z Unpacking libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:25:22.0483062Z Selecting previously unselected package libxkbfile1:amd64.
|
|
||||||
2026-06-27T12:25:22.0527958Z Preparing to unpack .../54-libxkbfile1_1%3a1.1.0-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.0579759Z Unpacking libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:25:22.1193305Z Selecting previously unselected package libxrandr2:amd64.
|
|
||||||
2026-06-27T12:25:22.1221273Z Preparing to unpack .../55-libxrandr2_2%3a1.5.2-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.1254284Z Unpacking libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:25:22.1652661Z Selecting previously unselected package x11-xkb-utils.
|
|
||||||
2026-06-27T12:25:22.1685675Z Preparing to unpack .../56-x11-xkb-utils_7.7+8build2_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.1748649Z Unpacking x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:25:22.2074972Z Selecting previously unselected package xfonts-encodings.
|
|
||||||
2026-06-27T12:25:22.2105634Z Preparing to unpack .../57-xfonts-encodings_1%3a1.0.5-0ubuntu2_all.deb ...
|
|
||||||
2026-06-27T12:25:22.2158216Z Unpacking xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:25:22.2939590Z Selecting previously unselected package xfonts-utils.
|
|
||||||
2026-06-27T12:25:22.3268379Z Preparing to unpack .../58-xfonts-utils_1%3a7.7+6build3_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.3344768Z Unpacking xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:25:22.4774674Z Selecting previously unselected package xfonts-cyrillic.
|
|
||||||
2026-06-27T12:25:22.4805186Z Preparing to unpack .../59-xfonts-cyrillic_1%3a1.0.5+nmu1_all.deb ...
|
|
||||||
2026-06-27T12:25:22.4869412Z Unpacking xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:25:22.5928434Z Selecting previously unselected package xfonts-scalable.
|
|
||||||
2026-06-27T12:25:22.6009105Z Preparing to unpack .../60-xfonts-scalable_1%3a1.0.3-1.3_all.deb ...
|
|
||||||
2026-06-27T12:25:22.6046032Z Unpacking xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:25:22.6553773Z Selecting previously unselected package xserver-common.
|
|
||||||
2026-06-27T12:25:22.6658145Z Preparing to unpack .../61-xserver-common_2%3a21.1.12-1ubuntu1.6_all.deb ...
|
|
||||||
2026-06-27T12:25:22.6693498Z Unpacking xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:25:22.7098546Z Selecting previously unselected package libglvnd0:amd64.
|
|
||||||
2026-06-27T12:25:22.7112207Z Preparing to unpack .../62-libglvnd0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.7134464Z Unpacking libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:22.7793087Z Selecting previously unselected package libglx0:amd64.
|
|
||||||
2026-06-27T12:25:22.7825161Z Preparing to unpack .../63-libglx0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.7892929Z Unpacking libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:22.8279183Z Selecting previously unselected package libgl1:amd64.
|
|
||||||
2026-06-27T12:25:22.8309051Z Preparing to unpack .../64-libgl1_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.8357828Z Unpacking libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:22.8913425Z Selecting previously unselected package xvfb.
|
|
||||||
2026-06-27T12:25:22.8937575Z Preparing to unpack .../65-xvfb_2%3a21.1.12-1ubuntu1.6_amd64.deb ...
|
|
||||||
2026-06-27T12:25:22.8998528Z Unpacking xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:25:23.0030934Z Setting up libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.0107870Z Setting up libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:25:23.0240084Z Setting up libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.0389817Z Setting up libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:25:23.0548046Z Setting up libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:25:23.0880779Z Setting up libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.1092069Z Setting up libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:25:23.1231089Z Setting up libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:25:23.1387593Z Setting up fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:25:23.1517269Z Setting up libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.1636439Z Setting up libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.1757658Z Setting up libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:25:23.1952407Z Setting up fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:25:23.2353172Z Setting up fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:25:23.2477142Z Setting up xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:25:23.2609198Z Setting up libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:25:23.2742238Z Setting up libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:25:23.2892442Z Setting up libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.3042771Z Setting up libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:25:23.3182534Z Setting up libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:25:23.3294750Z Setting up libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:25:23.3430904Z Setting up fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:25:23.3570951Z Setting up libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:25:23.3719596Z Setting up libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:25:23.3863930Z Setting up libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.4013930Z Setting up libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:23.4140514Z Setting up libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.4273295Z Setting up xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.4372046Z Setting up libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:25:23.4462363Z Setting up libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:25:23.4542157Z Setting up libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:25:23.4652723Z Setting up libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.4738379Z Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:25:23.5017679Z update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
|
|
||||||
2026-06-27T12:25:23.5111406Z Setting up libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:25:23.5330443Z Setting up at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.5475834Z Setting up libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:23.5580992Z Setting up fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:25:23.5719138Z Setting up libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:25:23.5881350Z Setting up libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.5960151Z Setting up libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:25:23.6028072Z Setting up libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:25:23.6111284Z Setting up libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:25:23.6190948Z Setting up fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:25:23.6253263Z Setting up libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.6376295Z Setting up libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.6474344Z Setting up x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:25:23.6572761Z Setting up libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:23.6657522Z Setting up libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:25:23.6805104Z Setting up xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:25:23.6963274Z Setting up libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.7128113Z Setting up xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:25:23.7210877Z Setting up xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:25:23.8012389Z Setting up xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:25:23.8159799Z Setting up libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:25:23.8319653Z Setting up xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:25:23.8920871Z Setting up libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.9061174Z Setting up libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:25:23.9241008Z Setting up libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.9377793Z Setting up libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:25:23.9529465Z Setting up mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.9689097Z Setting up libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.9798647Z Setting up libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:23.9991153Z Setting up libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:25:24.0060033Z Setting up libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:24.0148874Z Setting up libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:25:24.0245825Z Setting up xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:25:24.0347952Z Processing triggers for fontconfig (2.15.0-1.1ubuntu2) ...
|
|
||||||
2026-06-27T12:25:24.2719323Z Processing triggers for libc-bin (2.39-0ubuntu8.7) ...
|
|
||||||
2026-06-27T12:25:24.8537493Z ::group::Run set -e
|
|
||||||
2026-06-27T12:25:24.8537829Z set -e
|
|
||||||
2026-06-27T12:25:24.8537933Z EXPECTED_VERSION="$(git rev-parse --short HEAD)"
|
|
||||||
2026-06-27T12:25:24.8538041Z for i in $(seq 1 60); do
|
|
||||||
2026-06-27T12:25:24.8538129Z VERSION_BODY="$(curl -fsS "http://${DEPLOY_HOST}/taxbaik/version.txt" || true)"
|
|
||||||
2026-06-27T12:25:24.8538238Z BLOG_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/blog/accountant-mistakes-5" || true)"
|
|
||||||
2026-06-27T12:25:24.8538331Z if echo "$VERSION_BODY" | grep -q "Version: ${EXPECTED_VERSION}" && [ "$BLOG_STATUS" = "200" ]; then
|
|
||||||
2026-06-27T12:25:24.8538433Z echo "Deployment is ready for ${EXPECTED_VERSION}"
|
|
||||||
2026-06-27T12:25:24.8538558Z exit 0
|
|
||||||
2026-06-27T12:25:24.8538627Z fi
|
|
||||||
2026-06-27T12:25:24.8538693Z echo "Waiting for deployment ${EXPECTED_VERSION}; blog status=${BLOG_STATUS}; version=${VERSION_BODY}"
|
|
||||||
2026-06-27T12:25:24.8538794Z sleep 10
|
|
||||||
2026-06-27T12:25:24.8538866Z done
|
|
||||||
2026-06-27T12:25:24.8538930Z echo "Deployment did not publish expected version ${EXPECTED_VERSION} in time" >&2
|
|
||||||
2026-06-27T12:25:24.8539017Z exit 1
|
|
||||||
2026-06-27T12:25:24.8539093Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:25:24.8539184Z env:
|
|
||||||
2026-06-27T12:25:24.8539255Z DEPLOY_HOST: ***
|
|
||||||
2026-06-27T12:25:24.8539337Z ::endgroup::
|
|
||||||
2026-06-27T12:25:25.0402214Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:25:25.0579354Z Waiting for deployment 9f7e016; blog status=502; version=
|
|
||||||
2026-06-27T12:25:35.0698027Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:25:35.0843291Z Waiting for deployment 9f7e016; blog status=502; version=
|
|
||||||
2026-06-27T12:25:45.0997074Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:25:45.1210899Z Waiting for deployment 9f7e016; blog status=502; version=
|
|
||||||
2026-06-27T12:25:55.1284047Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:25:55.1377463Z Waiting for deployment 9f7e016; blog status=502; version=
|
|
||||||
2026-06-27T12:26:05.1672550Z Deployment is ready for 9f7e016
|
|
||||||
2026-06-27T12:26:05.2848371Z ::group::Run npm run test:e2e
|
|
||||||
2026-06-27T12:26:05.2848778Z npm run test:e2e
|
|
||||||
2026-06-27T12:26:05.2848904Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:26:05.2849089Z env:
|
|
||||||
2026-06-27T12:26:05.2849215Z E2E_BASE_URL: http://***/taxbaik
|
|
||||||
2026-06-27T12:26:05.2849346Z E2E_ADMIN_USERNAME: admin
|
|
||||||
2026-06-27T12:26:05.2849438Z E2E_ADMIN_PASSWORD: ***
|
|
||||||
2026-06-27T12:26:05.2849532Z ::endgroup::
|
|
||||||
2026-06-27T12:26:05.4936839Z
|
|
||||||
2026-06-27T12:26:05.4938525Z > test:e2e
|
|
||||||
2026-06-27T12:26:05.4938795Z > playwright test
|
|
||||||
2026-06-27T12:26:05.4938899Z
|
|
||||||
2026-06-27T12:26:07.0908736Z
|
|
||||||
2026-06-27T12:26:07.0909505Z Running 8 tests using 1 worker
|
|
||||||
2026-06-27T12:26:07.0913297Z
|
|
||||||
2026-06-27T12:26:10.2546952Z ✓ 1 [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard (2.0s)
|
|
||||||
2026-06-27T12:26:10.5255600Z - 2 [chromium] › tests/e2e/admin-password-change.spec.ts:10:7 › admin password change › changes password through the real admin UI
|
|
||||||
2026-06-27T12:26:32.6254900Z ✘ 3 [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors (22.0s)
|
|
||||||
2026-06-27T12:26:55.5960306Z ✘ 4 [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors (retry #1) (22.1s)
|
|
||||||
2026-06-27T12:26:57.5569909Z ✓ 5 [chromium] › tests/e2e/blog-seo.spec.ts:6:7 › blog seo › exposes title description and canonical on blog detail pages (1.1s)
|
|
||||||
2026-06-27T12:26:57.6187120Z ✓ 6 [chromium] › tests/e2e/contact-submit.spec.ts:9:7 › contact submit › creates an inquiry through the public API (42ms)
|
|
||||||
2026-06-27T12:27:19.7145266Z ✘ 7 [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list (22.0s)
|
|
||||||
2026-06-27T12:27:42.8326880Z ✘ 8 [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list (retry #1) (22.2s)
|
|
||||||
2026-06-27T12:27:55.0994094Z ✘ 9 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (11.3s)
|
|
||||||
2026-06-27T12:28:07.3933486Z ✘ 10 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (retry #1) (11.3s)
|
|
||||||
2026-06-27T12:28:09.9904674Z ✓ 11 [chromium] › tests/e2e/public-smoke.spec.ts:6:7 › public smoke › loads the main public pages with SEO basics (1.6s)
|
|
||||||
2026-06-27T12:28:10.0454623Z
|
|
||||||
2026-06-27T12:28:10.0460081Z
|
|
||||||
2026-06-27T12:28:10.0473094Z 1) [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors
|
|
||||||
2026-06-27T12:28:10.0473448Z
|
|
||||||
2026-06-27T12:28:10.0473752Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0473949Z
|
|
||||||
2026-06-27T12:28:10.0474156Z Locator: locator('.mud-main-content').getByText(/이번달 문의/).first()
|
|
||||||
2026-06-27T12:28:10.0474341Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0474485Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:28:10.0474612Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0474757Z
|
|
||||||
2026-06-27T12:28:10.0474897Z Call log:
|
|
||||||
2026-06-27T12:28:10.0475054Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:28:10.0475243Z [2m - waiting for locator('.mud-main-content').getByText(/이번달 문의/).first()[22m
|
|
||||||
2026-06-27T12:28:10.0475428Z
|
|
||||||
2026-06-27T12:28:10.0475506Z
|
|
||||||
2026-06-27T12:28:10.0475574Z 33 | await page.goto(`${baseUrl}${check.path}`);
|
|
||||||
2026-06-27T12:28:10.0475656Z 34 | await expect(page).toHaveURL(new RegExp(`${check.path}$`));
|
|
||||||
2026-06-27T12:28:10.0475761Z > 35 | await expect(page.locator('.mud-main-content').getByText(check.content).first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:28:10.0475935Z | ^
|
|
||||||
2026-06-27T12:28:10.0476343Z 36 | }
|
|
||||||
2026-06-27T12:28:10.0476521Z 37 |
|
|
||||||
2026-06-27T12:28:10.0476702Z 38 | expect(consoleErrors, 'browser console/page errors').toEqual([]);
|
|
||||||
2026-06-27T12:28:10.0476879Z at /workspace/***/taxbaik/tests/e2e/admin-smoke.spec.ts:35:88
|
|
||||||
2026-06-27T12:28:10.0477048Z
|
|
||||||
2026-06-27T12:28:10.0477202Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0477438Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0477635Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0477880Z
|
|
||||||
2026-06-27T12:28:10.0478014Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0478232Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/video.webm
|
|
||||||
2026-06-27T12:28:10.0478409Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0478636Z
|
|
||||||
2026-06-27T12:28:10.0478772Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0478910Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0478997Z Usage:
|
|
||||||
2026-06-27T12:28:10.0479074Z
|
|
||||||
2026-06-27T12:28:10.0479200Z npx playwright show-trace test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0479361Z
|
|
||||||
2026-06-27T12:28:10.0479495Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0479715Z
|
|
||||||
2026-06-27T12:28:10.0479888Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0480088Z
|
|
||||||
2026-06-27T12:28:10.0480218Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0480394Z
|
|
||||||
2026-06-27T12:28:10.0480545Z Locator: locator('.mud-main-content').getByText(/이번달 문의/).first()
|
|
||||||
2026-06-27T12:28:10.0480724Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0480907Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:28:10.0481044Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0481138Z
|
|
||||||
2026-06-27T12:28:10.0481207Z Call log:
|
|
||||||
2026-06-27T12:28:10.0481284Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:28:10.0481366Z [2m - waiting for locator('.mud-main-content').getByText(/이번달 문의/).first()[22m
|
|
||||||
2026-06-27T12:28:10.0481516Z
|
|
||||||
2026-06-27T12:28:10.0481628Z
|
|
||||||
2026-06-27T12:28:10.0481773Z 33 | await page.goto(`${baseUrl}${check.path}`);
|
|
||||||
2026-06-27T12:28:10.0481952Z 34 | await expect(page).toHaveURL(new RegExp(`${check.path}$`));
|
|
||||||
2026-06-27T12:28:10.0482272Z > 35 | await expect(page.locator('.mud-main-content').getByText(check.content).first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:28:10.0482474Z | ^
|
|
||||||
2026-06-27T12:28:10.0482637Z 36 | }
|
|
||||||
2026-06-27T12:28:10.0482772Z 37 |
|
|
||||||
2026-06-27T12:28:10.0482907Z 38 | expect(consoleErrors, 'browser console/page errors').toEqual([]);
|
|
||||||
2026-06-27T12:28:10.0483100Z at /workspace/***/taxbaik/tests/e2e/admin-smoke.spec.ts:35:88
|
|
||||||
2026-06-27T12:28:10.0483254Z
|
|
||||||
2026-06-27T12:28:10.0483373Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0483571Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0483784Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0484013Z
|
|
||||||
2026-06-27T12:28:10.0484140Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0484297Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:28:10.0484449Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0484653Z
|
|
||||||
2026-06-27T12:28:10.0484795Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0485007Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0485201Z Usage:
|
|
||||||
2026-06-27T12:28:10.0485324Z
|
|
||||||
2026-06-27T12:28:10.0485458Z npx playwright show-trace test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0485633Z
|
|
||||||
2026-06-27T12:28:10.0485776Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0486006Z
|
|
||||||
2026-06-27T12:28:10.0489412Z 2) [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list
|
|
||||||
2026-06-27T12:28:10.0490271Z
|
|
||||||
2026-06-27T12:28:10.0490398Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0490509Z
|
|
||||||
2026-06-27T12:28:10.0490831Z Locator: locator('.mud-main-content').getByText('문의 관리').first()
|
|
||||||
2026-06-27T12:28:10.0491000Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0491151Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:28:10.0491297Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0491438Z
|
|
||||||
2026-06-27T12:28:10.0491569Z Call log:
|
|
||||||
2026-06-27T12:28:10.0491724Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:28:10.0491891Z [2m - waiting for locator('.mud-main-content').getByText('문의 관리').first()[22m
|
|
||||||
2026-06-27T12:28:10.0492213Z
|
|
||||||
2026-06-27T12:28:10.0492335Z
|
|
||||||
2026-06-27T12:28:10.0492446Z 51 | await installAdminToken(page, token);
|
|
||||||
2026-06-27T12:28:10.0492616Z 52 | await page.goto(`${baseUrl}/admin/inquiries`);
|
|
||||||
2026-06-27T12:28:10.0492785Z > 53 | await expect(page.locator('.mud-main-content').getByText('문의 관리').first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:28:10.0492997Z | ^
|
|
||||||
2026-06-27T12:28:10.0493163Z 54 | });
|
|
||||||
2026-06-27T12:28:10.0493427Z 55 | });
|
|
||||||
2026-06-27T12:28:10.0493507Z 56 |
|
|
||||||
2026-06-27T12:28:10.0493581Z at /workspace/***/taxbaik/tests/e2e/contact-submit.spec.ts:53:80
|
|
||||||
2026-06-27T12:28:10.0493710Z
|
|
||||||
2026-06-27T12:28:10.0493839Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0494121Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0494321Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0494637Z
|
|
||||||
2026-06-27T12:28:10.0494824Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0495068Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/video.webm
|
|
||||||
2026-06-27T12:28:10.0495238Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0495445Z
|
|
||||||
2026-06-27T12:28:10.0495645Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0495842Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0495995Z Usage:
|
|
||||||
2026-06-27T12:28:10.0496503Z
|
|
||||||
2026-06-27T12:28:10.0496657Z npx playwright show-trace test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0496768Z
|
|
||||||
2026-06-27T12:28:10.0496861Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0497001Z
|
|
||||||
2026-06-27T12:28:10.0497092Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0497290Z
|
|
||||||
2026-06-27T12:28:10.0497458Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0497624Z
|
|
||||||
2026-06-27T12:28:10.0497749Z Locator: locator('.mud-main-content').getByText('문의 관리').first()
|
|
||||||
2026-06-27T12:28:10.0497901Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0498098Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:28:10.0498303Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0498452Z
|
|
||||||
2026-06-27T12:28:10.0498628Z Call log:
|
|
||||||
2026-06-27T12:28:10.0498795Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:28:10.0498953Z [2m - waiting for locator('.mud-main-content').getByText('문의 관리').first()[22m
|
|
||||||
2026-06-27T12:28:10.0499066Z
|
|
||||||
2026-06-27T12:28:10.0499173Z
|
|
||||||
2026-06-27T12:28:10.0499241Z 51 | await installAdminToken(page, token);
|
|
||||||
2026-06-27T12:28:10.0499338Z 52 | await page.goto(`${baseUrl}/admin/inquiries`);
|
|
||||||
2026-06-27T12:28:10.0499442Z > 53 | await expect(page.locator('.mud-main-content').getByText('문의 관리').first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:28:10.0499649Z | ^
|
|
||||||
2026-06-27T12:28:10.0499814Z 54 | });
|
|
||||||
2026-06-27T12:28:10.0499962Z 55 | });
|
|
||||||
2026-06-27T12:28:10.0500164Z 56 |
|
|
||||||
2026-06-27T12:28:10.0500308Z at /workspace/***/taxbaik/tests/e2e/contact-submit.spec.ts:53:80
|
|
||||||
2026-06-27T12:28:10.0500477Z
|
|
||||||
2026-06-27T12:28:10.0500662Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0500870Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0501047Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0501249Z
|
|
||||||
2026-06-27T12:28:10.0501420Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0501635Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:28:10.0501890Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0502498Z
|
|
||||||
2026-06-27T12:28:10.0502640Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0502892Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0503047Z Usage:
|
|
||||||
2026-06-27T12:28:10.0503213Z
|
|
||||||
2026-06-27T12:28:10.0503387Z npx playwright show-trace test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0503567Z
|
|
||||||
2026-06-27T12:28:10.0503745Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0503960Z
|
|
||||||
2026-06-27T12:28:10.0504098Z 3) [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:28:10.0504262Z
|
|
||||||
2026-06-27T12:28:10.0504564Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0504714Z
|
|
||||||
2026-06-27T12:28:10.0504866Z Locator: getByText('Detail-1782563263796')
|
|
||||||
2026-06-27T12:28:10.0505081Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0505231Z Timeout: 10000ms
|
|
||||||
2026-06-27T12:28:10.0505381Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0505528Z
|
|
||||||
2026-06-27T12:28:10.0505645Z Call log:
|
|
||||||
2026-06-27T12:28:10.0505719Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:28:10.0505800Z [2m - waiting for getByText('Detail-1782563263796')[22m
|
|
||||||
2026-06-27T12:28:10.0505923Z
|
|
||||||
2026-06-27T12:28:10.0505984Z
|
|
||||||
2026-06-27T12:28:10.0506049Z 36 |
|
|
||||||
2026-06-27T12:28:10.0506702Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:28:10.0506989Z > 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0510507Z | ^
|
|
||||||
2026-06-27T12:28:10.0510666Z 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0510874Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0511030Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0511191Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:38:40
|
|
||||||
2026-06-27T12:28:10.0511334Z
|
|
||||||
2026-06-27T12:28:10.0511532Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0511761Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0511946Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0512343Z
|
|
||||||
2026-06-27T12:28:10.0512455Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0512564Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/video.webm
|
|
||||||
2026-06-27T12:28:10.0512646Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0512938Z
|
|
||||||
2026-06-27T12:28:10.0513083Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0513271Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0513521Z Usage:
|
|
||||||
2026-06-27T12:28:10.0513669Z
|
|
||||||
2026-06-27T12:28:10.0513795Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:28:10.0513964Z
|
|
||||||
2026-06-27T12:28:10.0514159Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0514373Z
|
|
||||||
2026-06-27T12:28:10.0514497Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0514753Z
|
|
||||||
2026-06-27T12:28:10.0514878Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:28:10.0515020Z
|
|
||||||
2026-06-27T12:28:10.0515134Z Locator: getByText('Detail-1782563276056')
|
|
||||||
2026-06-27T12:28:10.0515379Z Expected: visible
|
|
||||||
2026-06-27T12:28:10.0515530Z Timeout: 10000ms
|
|
||||||
2026-06-27T12:28:10.0515683Z Error: element(s) not found
|
|
||||||
2026-06-27T12:28:10.0515867Z
|
|
||||||
2026-06-27T12:28:10.0515964Z Call log:
|
|
||||||
2026-06-27T12:28:10.0516037Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:28:10.0516373Z [2m - waiting for getByText('Detail-1782563276056')[22m
|
|
||||||
2026-06-27T12:28:10.0516612Z
|
|
||||||
2026-06-27T12:28:10.0516748Z
|
|
||||||
2026-06-27T12:28:10.0516877Z 36 |
|
|
||||||
2026-06-27T12:28:10.0517056Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:28:10.0517235Z > 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0517379Z | ^
|
|
||||||
2026-06-27T12:28:10.0517518Z 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0517706Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0517890Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:28:10.0518072Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:38:40
|
|
||||||
2026-06-27T12:28:10.0518298Z
|
|
||||||
2026-06-27T12:28:10.0518452Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0518575Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:28:10.0518668Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0518810Z
|
|
||||||
2026-06-27T12:28:10.0518894Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0519174Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:28:10.0519394Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0519618Z
|
|
||||||
2026-06-27T12:28:10.0519759Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0520059Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0520271Z Usage:
|
|
||||||
2026-06-27T12:28:10.0520412Z
|
|
||||||
2026-06-27T12:28:10.0520535Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:28:10.0520722Z
|
|
||||||
2026-06-27T12:28:10.0520896Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:28:10.0521120Z
|
|
||||||
2026-06-27T12:28:10.0521253Z 3 failed
|
|
||||||
2026-06-27T12:28:10.0521464Z [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors
|
|
||||||
2026-06-27T12:28:10.0521637Z [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list
|
|
||||||
2026-06-27T12:28:10.0521739Z [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:28:10.0521851Z 1 skipped
|
|
||||||
2026-06-27T12:28:10.0521946Z 4 passed (2.1m)
|
|
||||||
2026-06-27T12:28:10.1213717Z ❌ Failure - Main Browser E2E verification
|
|
||||||
2026-06-27T12:28:10.1330889Z exitcode '1': failure
|
|
||||||
2026-06-27T12:28:10.2333635Z ::group::Run echo "Executed tests:"
|
|
||||||
2026-06-27T12:28:10.2334218Z echo "Executed tests:"
|
|
||||||
2026-06-27T12:28:10.2334334Z echo "- admin-login"
|
|
||||||
2026-06-27T12:28:10.2334414Z echo "- admin-smoke"
|
|
||||||
2026-06-27T12:28:10.2334506Z echo "- public-smoke"
|
|
||||||
2026-06-27T12:28:10.2334583Z echo "- blog-seo"
|
|
||||||
2026-06-27T12:28:10.2334902Z echo "- contact-submit"
|
|
||||||
2026-06-27T12:28:10.2335042Z echo "- inquiry-detail"
|
|
||||||
2026-06-27T12:28:10.2335155Z echo "- admin-password-change"
|
|
||||||
2026-06-27T12:28:10.2335236Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:28:10.2335329Z ::endgroup::
|
|
||||||
2026-06-27T12:28:10.2801370Z Executed tests:
|
|
||||||
2026-06-27T12:28:10.2802324Z - admin-login
|
|
||||||
2026-06-27T12:28:10.2804066Z - admin-smoke
|
|
||||||
2026-06-27T12:28:10.2804181Z - public-smoke
|
|
||||||
2026-06-27T12:28:10.2804500Z - blog-seo
|
|
||||||
2026-06-27T12:28:10.2804597Z - contact-submit
|
|
||||||
2026-06-27T12:28:10.2804673Z - inquiry-detail
|
|
||||||
2026-06-27T12:28:10.2804767Z - admin-password-change
|
|
||||||
2026-06-27T12:28:10.3160536Z expression '${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}' rewritten to 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:28:10.3160888Z evaluating expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:28:10.3161546Z Writing entry to tarball workflow/hashfiles/index.js len:168437
|
|
||||||
2026-06-27T12:28:10.3163198Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:28:10.3205358Z 🐳 docker exec cmd=[node /var/run/act/workflow/hashfiles/index.js] user= workdir=
|
|
||||||
2026-06-27T12:28:10.3205701Z Exec command '[node /var/run/act/workflow/hashfiles/index.js]'
|
|
||||||
2026-06-27T12:28:10.3205967Z Working directory '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:28:10.4459391Z expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))' evaluated to '%!t(string=Linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f)'
|
|
||||||
2026-06-27T12:28:10.4460222Z expression '${{ runner.os }}-playwright-\n' rewritten to 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:28:10.4460368Z evaluating expression 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:28:10.4461512Z expression 'format('{0}-playwright-\n', runner.os)' evaluated to '%!t(string=Linux-playwright-\n)'
|
|
||||||
2026-06-27T12:28:10.4551474Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:28:10.4551820Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:28:10.4552213Z Skipping step 'Cache Playwright browsers' due to 'success()'
|
|
||||||
2026-06-27T12:28:10.4779722Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:28:10.4780359Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:28:10.4780556Z Skipping step 'Setup Node.js' due to 'success()'
|
|
||||||
2026-06-27T12:28:10.5070552Z evaluating expression 'always()'
|
|
||||||
2026-06-27T12:28:10.5071084Z expression 'always()' evaluated to 'true'
|
|
||||||
2026-06-27T12:28:10.5071211Z ⭐ Run Post Checkout code
|
|
||||||
2026-06-27T12:28:10.5071405Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:28:10.5071582Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:28:10.5071716Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:28:10.5073310Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:28:10.5074192Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:28:10.5074466Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:28:10.5114732Z run post step for 'Checkout code'
|
|
||||||
2026-06-27T12:28:10.5115552Z executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]
|
|
||||||
2026-06-27T12:28:10.5400613Z 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir=
|
|
||||||
2026-06-27T12:28:10.5401169Z Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]'
|
|
||||||
2026-06-27T12:28:10.5401663Z Working directory '/workspace/***/taxbaik'
|
|
||||||
-933
@@ -1,933 +0,0 @@
|
|||||||
2026-06-27T12:29:36.7691336Z hz-prod-runner-2(version:v0.6.1) received task 264 of job browser-e2e, be triggered by event: push
|
|
||||||
2026-06-27T12:29:36.7694477Z workflow prepared
|
|
||||||
2026-06-27T12:29:36.7695116Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:29:36.7695738Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T12:29:36.7695921Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:29:36.7777328Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T12:29:36.7777566Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:29:36.8108282Z Image exists? true
|
|
||||||
2026-06-27T12:29:36.8567663Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:29:36.9505056Z Created container name=GITEA-ACTIONS-TASK-264-WORKFLOW-TaxBaik-Browser-E2E-JOB-browser-45217cc8acb25ecbd03632e1a46b98ea77846cb6699a891987ecb2828106b2a7 id=e1e09f1492c3e0bf142559a016c77c16635d610fdfdf3bf41c6ccaa753041b9f from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T12:29:36.9505534Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T12:29:36.9505676Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:29:36.9505846Z Starting container: e1e09f1492c3e0bf142559a016c77c16635d610fdfdf3bf41c6ccaa753041b9f
|
|
||||||
2026-06-27T12:29:37.0765396Z Started container: e1e09f1492c3e0bf142559a016c77c16635d610fdfdf3bf41c6ccaa753041b9f
|
|
||||||
2026-06-27T12:29:37.1960199Z Writing entry to tarball workflow/event.json len:4956
|
|
||||||
2026-06-27T12:29:37.1960938Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:29:37.1961528Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T12:29:37.2189331Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T12:29:37.2189664Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:29:37.8321356Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T12:29:37.8321984Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:29:37.8437329Z Checked out v4
|
|
||||||
2026-06-27T12:29:37.8542967Z ☁ git clone 'https://github.com/actions/setup-node' # ref=v4
|
|
||||||
2026-06-27T12:29:37.8543514Z cloning https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:29:38.4811451Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:29:38.4811901Z Cloned https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:29:38.4969109Z Checked out v4
|
|
||||||
2026-06-27T12:29:38.5073104Z ☁ git clone 'https://github.com/actions/cache' # ref=v4
|
|
||||||
2026-06-27T12:29:38.5073443Z cloning https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:29:39.1225618Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:29:39.1226299Z Cloned https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:29:39.1456052Z Checked out v4
|
|
||||||
2026-06-27T12:29:39.1824973Z evaluating expression ''
|
|
||||||
2026-06-27T12:29:39.1825523Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T12:29:39.1825732Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T12:29:39.1825937Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:29:39.1826290Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:29:39.1826431Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:29:39.1826531Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:29:39.1826614Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:29:39.1826716Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:29:39.1883145Z ::group::Run Checkout code
|
|
||||||
2026-06-27T12:29:39.7220469Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T12:29:39.7225558Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T12:29:39.7230074Z ::group::Getting Git version info
|
|
||||||
2026-06-27T12:29:39.7231108Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:29:39.7275152Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T12:29:39.7325681Z git version 2.54.0
|
|
||||||
2026-06-27T12:29:39.7354354Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.7386306Z Temporarily overriding HOME='/tmp/f4bb7af9-eda2-4252-ab12-f87249c5c5d5' before making global git config changes
|
|
||||||
2026-06-27T12:29:39.7387489Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T12:29:39.7393456Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:29:39.7436842Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:29:39.7438398Z ::group::Initializing the repository
|
|
||||||
2026-06-27T12:29:39.7449605Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:29:39.7487226Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T12:29:39.7487537Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T12:29:39.7487662Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T12:29:39.7488148Z hint: call:
|
|
||||||
2026-06-27T12:29:39.7488339Z hint:
|
|
||||||
2026-06-27T12:29:39.7488420Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T12:29:39.7488504Z hint:
|
|
||||||
2026-06-27T12:29:39.7488574Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T12:29:39.7491160Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T12:29:39.7491362Z hint:
|
|
||||||
2026-06-27T12:29:39.7491856Z hint: git branch -m <name>
|
|
||||||
2026-06-27T12:29:39.7492109Z hint:
|
|
||||||
2026-06-27T12:29:39.7492642Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T12:29:39.7493529Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T12:29:39.7505742Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:29:39.7538494Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.7539121Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T12:29:39.7548311Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T12:29:39.7579335Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.7579569Z ::group::Setting up auth
|
|
||||||
2026-06-27T12:29:39.7587386Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T12:29:39.7621238Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T12:29:39.7873395Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T12:29:39.7909998Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T12:29:39.8254665Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T12:29:39.8293224Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T12:29:39.8556850Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T12:29:39.8602988Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.8605503Z ::group::Fetching the repository
|
|
||||||
2026-06-27T12:29:39.8616826Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +a58aa7efe0c15e08b1b44bd2a346c1e396d95d0d:refs/remotes/origin/master
|
|
||||||
2026-06-27T12:29:39.9599596Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:29:39.9599936Z * [new ref] a58aa7efe0c15e08b1b44bd2a346c1e396d95d0d -> origin/master
|
|
||||||
2026-06-27T12:29:39.9642493Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.9642737Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T12:29:39.9644555Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.9650560Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T12:29:39.9694614Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T12:29:39.9720917Z ::group::Checking out the ref
|
|
||||||
2026-06-27T12:29:39.9729039Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T12:29:39.9854670Z Reset branch 'master'
|
|
||||||
2026-06-27T12:29:39.9859808Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T12:29:39.9869462Z ::endgroup::
|
|
||||||
2026-06-27T12:29:39.9914900Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T12:29:39.9938854Z a58aa7efe0c15e08b1b44bd2a346c1e396d95d0d
|
|
||||||
2026-06-27T12:29:39.9961258Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T12:29:40.0064399Z ::endgroup::
|
|
||||||
2026-06-27T12:29:40.0891731Z ::group::Run Setup Node.js
|
|
||||||
2026-06-27T12:29:40.0892076Z with:
|
|
||||||
2026-06-27T12:29:40.0892295Z cache: npm
|
|
||||||
2026-06-27T12:29:40.0892404Z node-version: 22
|
|
||||||
2026-06-27T12:29:40.8936568Z Found in cache @ /opt/hostedtoolcache/node/22.23.1/x64
|
|
||||||
2026-06-27T12:29:40.8941998Z (node:142) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:29:40.8942471Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:29:40.8949121Z ::group::Environment details
|
|
||||||
2026-06-27T12:29:41.0292379Z node: v22.23.1
|
|
||||||
2026-06-27T12:29:41.0294290Z npm: 10.9.8
|
|
||||||
2026-06-27T12:29:41.0295741Z yarn:
|
|
||||||
2026-06-27T12:29:41.0300045Z ::endgroup::
|
|
||||||
2026-06-27T12:29:41.0329176Z [command]/opt/hostedtoolcache/node/22.23.1/x64/bin/npm config get cache
|
|
||||||
2026-06-27T12:29:41.1626400Z /root/.npm
|
|
||||||
2026-06-27T12:29:41.2556563Z Cache Size: ~3 MB (2871339 B)
|
|
||||||
2026-06-27T12:29:41.2586533Z [command]/usr/bin/tar -xf /tmp/5d869462-19ad-4a95-88dc-c430536e25e7/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:29:41.2730544Z Cache restored successfully
|
|
||||||
2026-06-27T12:29:41.2756629Z Cache restored from key: node-cache-linux-x64-npm-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:29:41.2757531Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/tsc.json
|
|
||||||
2026-06-27T12:29:41.2757882Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-stylish.json
|
|
||||||
2026-06-27T12:29:41.2758133Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-compact.json
|
|
||||||
2026-06-27T12:29:41.2859242Z ::endgroup::
|
|
||||||
2026-06-27T12:29:41.5247096Z ::group::Run Cache Playwright browsers
|
|
||||||
2026-06-27T12:29:41.5247489Z with:
|
|
||||||
2026-06-27T12:29:41.5247649Z key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
|
||||||
2026-06-27T12:29:41.5247797Z path: ~/.cache/ms-playwright
|
|
||||||
2026-06-27T12:29:41.5247918Z restore-keys: ${{ runner.os }}-playwright-
|
|
||||||
2026-06-27T12:29:42.3531176Z (node:203) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:29:42.3531512Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:29:43.6146807Z Cache Size: ~247 MB (259214535 B)
|
|
||||||
2026-06-27T12:29:43.6147723Z [command]/usr/bin/tar -xf /tmp/fb50196f-beb8-460f-9b32-c23060625c9f/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:29:45.3513116Z Cache restored successfully
|
|
||||||
2026-06-27T12:29:45.3879843Z Cache restored from key: linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:29:45.4007468Z ::endgroup::
|
|
||||||
2026-06-27T12:29:45.5403253Z ::group::Run set -e
|
|
||||||
2026-06-27T12:29:45.5403717Z set -e
|
|
||||||
2026-06-27T12:29:45.5403828Z npm ci
|
|
||||||
2026-06-27T12:29:45.5403937Z npx playwright install chromium --with-deps
|
|
||||||
2026-06-27T12:29:45.5404276Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:29:45.5404471Z ::endgroup::
|
|
||||||
2026-06-27T12:29:46.9344675Z
|
|
||||||
2026-06-27T12:29:46.9345427Z added 3 packages, and audited 4 packages in 1s
|
|
||||||
2026-06-27T12:29:46.9356622Z
|
|
||||||
2026-06-27T12:29:46.9356828Z found 0 vulnerabilities
|
|
||||||
2026-06-27T12:29:48.1251425Z Installing dependencies...
|
|
||||||
2026-06-27T12:29:48.2506189Z Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
|
|
||||||
2026-06-27T12:29:48.2506700Z Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
|
|
||||||
2026-06-27T12:29:48.2788540Z Get:3 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B]
|
|
||||||
2026-06-27T12:29:48.3326485Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
|
|
||||||
2026-06-27T12:29:48.3573970Z Get:5 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [43.8 kB]
|
|
||||||
2026-06-27T12:29:48.3663352Z Get:6 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble InRelease [24.3 kB]
|
|
||||||
2026-06-27T12:29:48.3861838Z Get:7 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [1339 kB]
|
|
||||||
2026-06-27T12:29:48.3886937Z Get:8 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
|
|
||||||
2026-06-27T12:29:48.4378908Z Get:9 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1487 kB]
|
|
||||||
2026-06-27T12:29:48.4530261Z Get:10 https://packages.microsoft.com/ubuntu/24.04/prod noble/main all Packages [643 B]
|
|
||||||
2026-06-27T12:29:48.5232927Z Get:11 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [187 kB]
|
|
||||||
2026-06-27T12:29:48.5233575Z Get:12 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [976 kB]
|
|
||||||
2026-06-27T12:29:48.6284935Z Get:13 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
|
|
||||||
2026-06-27T12:29:48.6685855Z Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
|
|
||||||
2026-06-27T12:29:48.8410616Z Get:15 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
|
|
||||||
2026-06-27T12:29:48.8427854Z Get:16 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
|
|
||||||
2026-06-27T12:29:48.8629712Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [49.5 kB]
|
|
||||||
2026-06-27T12:29:48.8671181Z Get:18 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble/main amd64 Packages [2988 B]
|
|
||||||
2026-06-27T12:29:48.8698245Z Get:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1296 kB]
|
|
||||||
2026-06-27T12:29:48.8850929Z Get:20 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [2108 kB]
|
|
||||||
2026-06-27T12:29:48.9123133Z Get:22 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [1412 kB]
|
|
||||||
2026-06-27T12:29:48.9914183Z Get:23 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [35.9 kB]
|
|
||||||
2026-06-27T12:29:49.0132999Z Get:24 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Packages [671 B]
|
|
||||||
2026-06-27T12:29:49.0177030Z Get:25 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [48.9 kB]
|
|
||||||
2026-06-27T12:29:49.4290157Z Get:21 https://packagecloud.io/github/git-lfs/ubuntu noble InRelease [29.2 kB]
|
|
||||||
2026-06-27T12:29:49.6712805Z Get:26 https://packagecloud.io/github/git-lfs/ubuntu noble/main amd64 Packages [1273 B]
|
|
||||||
2026-06-27T12:29:49.9781203Z Fetched 31.3 MB in 2s (17.4 MB/s)
|
|
||||||
2026-06-27T12:29:51.1160280Z Reading package lists...
|
|
||||||
2026-06-27T12:29:52.2127226Z Reading package lists...
|
|
||||||
2026-06-27T12:29:52.4888169Z Building dependency tree...
|
|
||||||
2026-06-27T12:29:52.4897505Z Reading state information...
|
|
||||||
2026-06-27T12:29:52.8171581Z libcairo2 is already the newest version (1.18.0-3build1).
|
|
||||||
2026-06-27T12:29:52.8172975Z libcairo2 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8173274Z libdbus-1-3 is already the newest version (1.14.10-4ubuntu4.1).
|
|
||||||
2026-06-27T12:29:52.8173452Z libdbus-1-3 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8174021Z libglib2.0-0t64 is already the newest version (2.80.0-6ubuntu3.8).
|
|
||||||
2026-06-27T12:29:52.8174164Z libglib2.0-0t64 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8174253Z libpango-1.0-0 is already the newest version (1.52.1+ds-1build1).
|
|
||||||
2026-06-27T12:29:52.8174658Z libpango-1.0-0 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8174829Z libx11-6 is already the newest version (2:1.8.7-1build1).
|
|
||||||
2026-06-27T12:29:52.8174926Z libx11-6 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8175002Z libxcb1 is already the newest version (1.15-1ubuntu2).
|
|
||||||
2026-06-27T12:29:52.8175117Z libxcb1 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8175192Z libxext6 is already the newest version (2:1.3.4-1build2).
|
|
||||||
2026-06-27T12:29:52.8175579Z libxext6 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8175707Z libfontconfig1 is already the newest version (2.15.0-1.1ubuntu2).
|
|
||||||
2026-06-27T12:29:52.8175795Z libfontconfig1 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8175873Z libfreetype6 is already the newest version (2.13.2+dfsg-1ubuntu0.1).
|
|
||||||
2026-06-27T12:29:52.8175955Z libfreetype6 set to manually installed.
|
|
||||||
2026-06-27T12:29:52.8176539Z The following additional packages will be installed:
|
|
||||||
2026-06-27T12:29:52.8177593Z at-spi2-common libasound2-data libavahi-client3 libavahi-common-data
|
|
||||||
2026-06-27T12:29:52.8183119Z libavahi-common3 libdrm-amdgpu1 libdrm-common libdrm-intel1 libfontenc1
|
|
||||||
2026-06-27T12:29:52.8190965Z libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:29:52.8191332Z libpciaccess0 libsensors-config libsensors5 libvulkan1 libx11-xcb1 libxaw7
|
|
||||||
2026-06-27T12:29:52.8207849Z libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-sync1
|
|
||||||
2026-06-27T12:29:52.8208612Z libxcb-xfixes0 libxfont2 libxi6 libxkbfile1 libxmu6 libxmuu1 libxpm4
|
|
||||||
2026-06-27T12:29:52.8208800Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:29:52.8208952Z xfonts-encodings xfonts-utils xkb-data xserver-common
|
|
||||||
2026-06-27T12:29:52.8215870Z Suggested packages:
|
|
||||||
2026-06-27T12:29:52.8216800Z alsa-utils libasound2-plugins cups-common pciutils lm-sensors
|
|
||||||
2026-06-27T12:29:52.8217268Z Recommended packages:
|
|
||||||
2026-06-27T12:29:52.8217512Z fonts-ipafont-mincho fonts-liberation-sans-narrow fonts-tlwg-loma
|
|
||||||
2026-06-27T12:29:52.8217656Z alsa-ucm-conf alsa-topology-conf at-spi2-core mesa-vulkan-drivers
|
|
||||||
2026-06-27T12:29:52.8217803Z | vulkan-icd xfonts-base
|
|
||||||
2026-06-27T12:29:52.9516943Z The following NEW packages will be installed:
|
|
||||||
2026-06-27T12:29:52.9517535Z at-spi2-common fonts-freefont-ttf fonts-ipafont-gothic fonts-liberation
|
|
||||||
2026-06-27T12:29:52.9525521Z fonts-noto-color-emoji fonts-tlwg-loma-otf fonts-unifont fonts-wqy-zenhei
|
|
||||||
2026-06-27T12:29:52.9525929Z libasound2-data libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64
|
|
||||||
2026-06-27T12:29:52.9526055Z libatspi2.0-0t64 libavahi-client3 libavahi-common-data libavahi-common3
|
|
||||||
2026-06-27T12:29:52.9526656Z libcups2t64 libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm2 libfontenc1
|
|
||||||
2026-06-27T12:29:52.9529001Z libgbm1 libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:29:52.9533391Z libnspr4 libnss3 libpciaccess0 libsensors-config libsensors5 libvulkan1
|
|
||||||
2026-06-27T12:29:52.9533730Z libx11-xcb1 libxaw7 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0
|
|
||||||
2026-06-27T12:29:52.9533957Z libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxdamage1 libxfixes3 libxfont2
|
|
||||||
2026-06-27T12:29:52.9535675Z libxi6 libxkbcommon0 libxkbfile1 libxmu6 libxmuu1 libxpm4 libxrandr2
|
|
||||||
2026-06-27T12:29:52.9547165Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:29:52.9547497Z xfonts-cyrillic xfonts-encodings xfonts-scalable xfonts-utils xkb-data
|
|
||||||
2026-06-27T12:29:52.9547633Z xserver-common xvfb
|
|
||||||
2026-06-27T12:29:53.0373995Z 0 upgraded, 66 newly installed, 0 to remove and 52 not upgraded.
|
|
||||||
2026-06-27T12:29:53.0374517Z Need to get 79.3 MB of archives.
|
|
||||||
2026-06-27T12:29:53.0374708Z After this operation, 303 MB of additional disk space will be used.
|
|
||||||
2026-06-27T12:29:53.0374826Z Get:1 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3513 kB]
|
|
||||||
2026-06-27T12:29:53.1513498Z Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xkb-data all 2.41-2ubuntu1.1 [397 kB]
|
|
||||||
2026-06-27T12:29:53.1573982Z Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-common all 2.4.125-1ubuntu0.1~24.04.2 [9250 B]
|
|
||||||
2026-06-27T12:29:53.1645112Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm2 amd64 2.4.125-1ubuntu0.1~24.04.2 [41.4 kB]
|
|
||||||
2026-06-27T12:29:53.1707412Z Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors-config all 1:3.6.0-9build1 [5546 B]
|
|
||||||
2026-06-27T12:29:53.1770886Z Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors5 amd64 1:3.6.0-9build1 [26.6 kB]
|
|
||||||
2026-06-27T12:29:53.1834263Z Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbcommon0 amd64 1.6.0-1build1 [122 kB]
|
|
||||||
2026-06-27T12:29:53.1906696Z Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmuu1 amd64 2:1.1.3-3build2 [8958 B]
|
|
||||||
2026-06-27T12:29:53.1977009Z Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 xauth amd64 1:1.1.2-1build1 [25.6 kB]
|
|
||||||
2026-06-27T12:29:53.2036591Z Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 at-spi2-common all 2.52.0-1build1 [8674 B]
|
|
||||||
2026-06-27T12:29:53.2100594Z Get:11 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-freefont-ttf all 20211204+svn4273-2 [5641 kB]
|
|
||||||
2026-06-27T12:29:53.2682487Z Get:12 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-liberation all 1:2.1.5-3 [1603 kB]
|
|
||||||
2026-06-27T12:29:53.2815879Z Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 fonts-noto-color-emoji all 2.047-0ubuntu0.24.04.1 [9764 kB]
|
|
||||||
2026-06-27T12:29:53.3750188Z Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-tlwg-loma-otf all 1:0.7.3-1 [107 kB]
|
|
||||||
2026-06-27T12:29:53.3767166Z Get:15 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-unifont all 1:15.1.01-1build1 [2993 kB]
|
|
||||||
2026-06-27T12:29:53.4049421Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-wqy-zenhei all 0.9.45-8 [7472 kB]
|
|
||||||
2026-06-27T12:29:53.4441929Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.2 [21.3 kB]
|
|
||||||
2026-06-27T12:29:53.4446837Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.2 [398 kB]
|
|
||||||
2026-06-27T12:29:53.4472919Z Get:19 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk1.0-0t64 amd64 2.52.0-1build1 [55.3 kB]
|
|
||||||
2026-06-27T12:29:53.4509500Z Get:20 http://archive.ubuntu.com/ubuntu noble/main amd64 libxi6 amd64 2:1.8.1-1build1 [32.4 kB]
|
|
||||||
2026-06-27T12:29:53.4780264Z Get:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libatspi2.0-0t64 amd64 2.52.0-1build1 [80.5 kB]
|
|
||||||
2026-06-27T12:29:53.4829146Z Get:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk-bridge2.0-0t64 amd64 2.52.0-1build1 [66.0 kB]
|
|
||||||
2026-06-27T12:29:53.4894417Z Get:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common-data amd64 0.8-13ubuntu6.2 [30.1 kB]
|
|
||||||
2026-06-27T12:29:53.4972529Z Get:24 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common3 amd64 0.8-13ubuntu6.2 [23.4 kB]
|
|
||||||
2026-06-27T12:29:53.5039534Z Get:25 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-client3 amd64 0.8-13ubuntu6.2 [26.8 kB]
|
|
||||||
2026-06-27T12:29:53.5102014Z Get:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcups2t64 amd64 2.4.7-1.2ubuntu7.14 [274 kB]
|
|
||||||
2026-06-27T12:29:53.5204236Z Get:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-amdgpu1 amd64 2.4.125-1ubuntu0.1~24.04.2 [21.4 kB]
|
|
||||||
2026-06-27T12:29:53.5261626Z Get:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpciaccess0 amd64 0.17-3ubuntu0.24.04.2 [18.9 kB]
|
|
||||||
2026-06-27T12:29:53.5328530Z Get:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-intel1 amd64 2.4.125-1ubuntu0.1~24.04.2 [63.9 kB]
|
|
||||||
2026-06-27T12:29:53.5386245Z Get:30 http://archive.ubuntu.com/ubuntu noble/main amd64 libfontenc1 amd64 1:1.1.8-1build1 [14.0 kB]
|
|
||||||
2026-06-27T12:29:53.5508051Z Get:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libllvm20 amd64 1:20.1.2-0ubuntu1~24.04.3 [30.6 MB]
|
|
||||||
2026-06-27T12:29:53.7675321Z Get:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-xcb1 amd64 2:1.8.7-1build1 [7800 B]
|
|
||||||
2026-06-27T12:29:53.7678635Z Get:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-dri3-0 amd64 1.15-1ubuntu2 [7142 B]
|
|
||||||
2026-06-27T12:29:53.7681087Z Get:34 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-present0 amd64 1.15-1ubuntu2 [5676 B]
|
|
||||||
2026-06-27T12:29:53.7683582Z Get:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-randr0 amd64 1.15-1ubuntu2 [17.9 kB]
|
|
||||||
2026-06-27T12:29:53.7686011Z Get:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-sync1 amd64 1.15-1ubuntu2 [9312 B]
|
|
||||||
2026-06-27T12:29:53.7688522Z Get:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-xfixes0 amd64 1.15-1ubuntu2 [10.2 kB]
|
|
||||||
2026-06-27T12:29:53.7691274Z Get:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libxshmfence1 amd64 1.3-1build5 [4764 B]
|
|
||||||
2026-06-27T12:29:53.7709108Z Get:39 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 mesa-libgallium amd64 25.2.8-0ubuntu0.24.04.2 [10.8 MB]
|
|
||||||
2026-06-27T12:29:53.8458351Z Get:40 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgbm1 amd64 25.2.8-0ubuntu0.24.04.2 [34.2 kB]
|
|
||||||
2026-06-27T12:29:53.8467058Z Get:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libvulkan1 amd64 1.3.275.0-1build1 [142 kB]
|
|
||||||
2026-06-27T12:29:53.8481660Z Get:42 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgl1-mesa-dri amd64 25.2.8-0ubuntu0.24.04.2 [37.9 kB]
|
|
||||||
2026-06-27T12:29:53.8489547Z Get:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-glx0 amd64 1.15-1ubuntu2 [24.8 kB]
|
|
||||||
2026-06-27T12:29:53.8496627Z Get:44 http://archive.ubuntu.com/ubuntu noble/main amd64 libxxf86vm1 amd64 1:1.1.4-1build4 [9282 B]
|
|
||||||
2026-06-27T12:29:53.8511134Z Get:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libglx-mesa0 amd64 25.2.8-0ubuntu0.24.04.2 [110 kB]
|
|
||||||
2026-06-27T12:29:53.8581593Z Get:46 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 [117 kB]
|
|
||||||
2026-06-27T12:29:53.8649924Z Get:47 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss3 amd64 2:3.98-1ubuntu0.1 [1445 kB]
|
|
||||||
2026-06-27T12:29:53.8827832Z Get:48 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmu6 amd64 2:1.1.3-3build2 [47.6 kB]
|
|
||||||
2026-06-27T12:29:53.8847347Z Get:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libxpm4 amd64 1:3.5.17-1build2 [36.5 kB]
|
|
||||||
2026-06-27T12:29:53.8894999Z Get:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libxaw7 amd64 2:1.0.14-1build2 [187 kB]
|
|
||||||
2026-06-27T12:29:53.8986710Z Get:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcomposite1 amd64 1:0.4.5-1build3 [6320 B]
|
|
||||||
2026-06-27T12:29:53.9048187Z Get:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libxdamage1 amd64 1:1.1.6-1build1 [6150 B]
|
|
||||||
2026-06-27T12:29:53.9112911Z Get:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfixes3 amd64 1:6.0.0-2build1 [10.8 kB]
|
|
||||||
2026-06-27T12:29:53.9186651Z Get:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfont2 amd64 1:2.0.6-1build1 [93.0 kB]
|
|
||||||
2026-06-27T12:29:53.9241391Z Get:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbfile1 amd64 1:1.1.0-1build4 [70.0 kB]
|
|
||||||
2026-06-27T12:29:53.9299425Z Get:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libxrandr2 amd64 2:1.5.2-2build1 [19.7 kB]
|
|
||||||
2026-06-27T12:29:53.9350812Z Get:57 http://archive.ubuntu.com/ubuntu noble/main amd64 x11-xkb-utils amd64 7.7+8build2 [170 kB]
|
|
||||||
2026-06-27T12:29:53.9428679Z Get:58 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 [578 kB]
|
|
||||||
2026-06-27T12:29:53.9504947Z Get:59 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-utils amd64 1:7.7+6build3 [94.4 kB]
|
|
||||||
2026-06-27T12:29:53.9561031Z Get:60 http://archive.ubuntu.com/ubuntu noble/universe amd64 xfonts-cyrillic all 1:1.0.5+nmu1 [384 kB]
|
|
||||||
2026-06-27T12:29:53.9646525Z Get:61 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-scalable all 1:1.0.3-1.3 [304 kB]
|
|
||||||
2026-06-27T12:29:53.9730776Z Get:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xserver-common all 2:21.1.12-1ubuntu1.6 [34.7 kB]
|
|
||||||
2026-06-27T12:29:53.9800405Z Get:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libglvnd0 amd64 1.7.0-1build1 [69.6 kB]
|
|
||||||
2026-06-27T12:29:54.0066025Z Get:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libglx0 amd64 1.7.0-1build1 [38.6 kB]
|
|
||||||
2026-06-27T12:29:54.0071830Z Get:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libgl1 amd64 1.7.0-1build1 [102 kB]
|
|
||||||
2026-06-27T12:29:54.0086721Z Get:66 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 xvfb amd64 2:21.1.12-1ubuntu1.6 [877 kB]
|
|
||||||
2026-06-27T12:29:54.2362385Z debconf: delaying package configuration, since apt-utils is not installed
|
|
||||||
2026-06-27T12:29:54.2759835Z Fetched 79.3 MB in 1s (76.6 MB/s)
|
|
||||||
2026-06-27T12:29:54.3038337Z Selecting previously unselected package fonts-ipafont-gothic.
|
|
||||||
2026-06-27T12:29:54.4436850Z (Reading database ...
|
|
||||||
(Reading database ... 5%
|
|
||||||
(Reading database ... 10%
|
|
||||||
(Reading database ... 15%
|
|
||||||
(Reading database ... 20%
|
|
||||||
(Reading database ... 25%
|
|
||||||
(Reading database ... 30%
|
|
||||||
(Reading database ... 35%
|
|
||||||
(Reading database ... 40%
|
|
||||||
(Reading database ... 45%
|
|
||||||
(Reading database ... 50%
|
|
||||||
(Reading database ... 55%
|
|
||||||
(Reading database ... 60%
|
|
||||||
(Reading database ... 65%
|
|
||||||
(Reading database ... 70%
|
|
||||||
(Reading database ... 75%
|
|
||||||
(Reading database ... 80%
|
|
||||||
(Reading database ... 85%
|
|
||||||
(Reading database ... 90%
|
|
||||||
(Reading database ... 95%
|
|
||||||
(Reading database ... 100%
|
|
||||||
(Reading database ... 26518 files and directories currently installed.)
|
|
||||||
2026-06-27T12:29:54.4453872Z Preparing to unpack .../00-fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
|
|
||||||
2026-06-27T12:29:54.4547701Z Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:29:54.7502498Z Selecting previously unselected package xkb-data.
|
|
||||||
2026-06-27T12:29:54.7531013Z Preparing to unpack .../01-xkb-data_2.41-2ubuntu1.1_all.deb ...
|
|
||||||
2026-06-27T12:29:54.7549713Z Unpacking xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:29:54.8278776Z Selecting previously unselected package libdrm-common.
|
|
||||||
2026-06-27T12:29:54.8307383Z Preparing to unpack .../02-libdrm-common_2.4.125-1ubuntu0.1~24.04.2_all.deb ...
|
|
||||||
2026-06-27T12:29:54.8325886Z Unpacking libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:29:54.8589268Z Selecting previously unselected package libdrm2:amd64.
|
|
||||||
2026-06-27T12:29:54.8589718Z Preparing to unpack .../03-libdrm2_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:54.8647120Z Unpacking libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:29:54.8871350Z Selecting previously unselected package libsensors-config.
|
|
||||||
2026-06-27T12:29:54.8877443Z Preparing to unpack .../04-libsensors-config_1%3a3.6.0-9build1_all.deb ...
|
|
||||||
2026-06-27T12:29:54.8906021Z Unpacking libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:29:54.9113765Z Selecting previously unselected package libsensors5:amd64.
|
|
||||||
2026-06-27T12:29:54.9142070Z Preparing to unpack .../05-libsensors5_1%3a3.6.0-9build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:54.9490446Z Unpacking libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:29:54.9749152Z Selecting previously unselected package libxkbcommon0:amd64.
|
|
||||||
2026-06-27T12:29:54.9758453Z Preparing to unpack .../06-libxkbcommon0_1.6.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:54.9799072Z Unpacking libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:29:55.0115639Z Selecting previously unselected package libxmuu1:amd64.
|
|
||||||
2026-06-27T12:29:55.0143317Z Preparing to unpack .../07-libxmuu1_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:55.0172030Z Unpacking libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:29:55.0414724Z Selecting previously unselected package xauth.
|
|
||||||
2026-06-27T12:29:55.0442615Z Preparing to unpack .../08-xauth_1%3a1.1.2-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:55.0465444Z Unpacking xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:29:55.0714732Z Selecting previously unselected package at-spi2-common.
|
|
||||||
2026-06-27T12:29:55.0754268Z Preparing to unpack .../09-at-spi2-common_2.52.0-1build1_all.deb ...
|
|
||||||
2026-06-27T12:29:55.0778632Z Unpacking at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:29:55.1049265Z Selecting previously unselected package fonts-freefont-ttf.
|
|
||||||
2026-06-27T12:29:55.1097884Z Preparing to unpack .../10-fonts-freefont-ttf_20211204+svn4273-2_all.deb ...
|
|
||||||
2026-06-27T12:29:55.1123366Z Unpacking fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:29:55.2872918Z Selecting previously unselected package fonts-liberation.
|
|
||||||
2026-06-27T12:29:55.2899008Z Preparing to unpack .../11-fonts-liberation_1%3a2.1.5-3_all.deb ...
|
|
||||||
2026-06-27T12:29:55.2927974Z Unpacking fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:29:55.3568970Z Selecting previously unselected package fonts-noto-color-emoji.
|
|
||||||
2026-06-27T12:29:55.3646821Z Preparing to unpack .../12-fonts-noto-color-emoji_2.047-0ubuntu0.24.04.1_all.deb ...
|
|
||||||
2026-06-27T12:29:55.3724781Z Unpacking fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:29:55.4854579Z Selecting previously unselected package fonts-tlwg-loma-otf.
|
|
||||||
2026-06-27T12:29:55.4889562Z Preparing to unpack .../13-fonts-tlwg-loma-otf_1%3a0.7.3-1_all.deb ...
|
|
||||||
2026-06-27T12:29:55.4913793Z Unpacking fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:29:55.5254192Z Selecting previously unselected package fonts-unifont.
|
|
||||||
2026-06-27T12:29:55.5287898Z Preparing to unpack .../14-fonts-unifont_1%3a15.1.01-1build1_all.deb ...
|
|
||||||
2026-06-27T12:29:55.5304102Z Unpacking fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:29:55.6708411Z Selecting previously unselected package fonts-wqy-zenhei.
|
|
||||||
2026-06-27T12:29:55.6738944Z Preparing to unpack .../15-fonts-wqy-zenhei_0.9.45-8_all.deb ...
|
|
||||||
2026-06-27T12:29:55.6859814Z Unpacking fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:29:56.2792688Z Selecting previously unselected package libasound2-data.
|
|
||||||
2026-06-27T12:29:56.2940002Z Preparing to unpack .../16-libasound2-data_1.2.11-1ubuntu0.2_all.deb ...
|
|
||||||
2026-06-27T12:29:56.3011544Z Unpacking libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:29:56.3930164Z Selecting previously unselected package libasound2t64:amd64.
|
|
||||||
2026-06-27T12:29:56.3997965Z Preparing to unpack .../17-libasound2t64_1.2.11-1ubuntu0.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.4048917Z Unpacking libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:29:56.4573839Z Selecting previously unselected package libatk1.0-0t64:amd64.
|
|
||||||
2026-06-27T12:29:56.4598997Z Preparing to unpack .../18-libatk1.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.4637724Z Unpacking libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:29:56.5098277Z Selecting previously unselected package libxi6:amd64.
|
|
||||||
2026-06-27T12:29:56.5124858Z Preparing to unpack .../19-libxi6_2%3a1.8.1-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.5188290Z Unpacking libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:29:56.5518533Z Selecting previously unselected package libatspi2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:29:56.5567874Z Preparing to unpack .../20-libatspi2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.5699758Z Unpacking libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:29:56.6391376Z Selecting previously unselected package libatk-bridge2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:29:56.6457696Z Preparing to unpack .../21-libatk-bridge2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.6509497Z Unpacking libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:29:56.7348340Z Selecting previously unselected package libavahi-common-data:amd64.
|
|
||||||
2026-06-27T12:29:56.7365329Z Preparing to unpack .../22-libavahi-common-data_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.7413367Z Unpacking libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:29:56.8118498Z Selecting previously unselected package libavahi-common3:amd64.
|
|
||||||
2026-06-27T12:29:56.8144825Z Preparing to unpack .../23-libavahi-common3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.8180402Z Unpacking libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:29:56.8481364Z Selecting previously unselected package libavahi-client3:amd64.
|
|
||||||
2026-06-27T12:29:56.8504185Z Preparing to unpack .../24-libavahi-client3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.8527325Z Unpacking libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:29:56.8768636Z Selecting previously unselected package libcups2t64:amd64.
|
|
||||||
2026-06-27T12:29:56.8786491Z Preparing to unpack .../25-libcups2t64_2.4.7-1.2ubuntu7.14_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.8808431Z Unpacking libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:29:56.9096960Z Selecting previously unselected package libdrm-amdgpu1:amd64.
|
|
||||||
2026-06-27T12:29:56.9100617Z Preparing to unpack .../26-libdrm-amdgpu1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.9134511Z Unpacking libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:29:56.9636914Z Selecting previously unselected package libpciaccess0:amd64.
|
|
||||||
2026-06-27T12:29:56.9697603Z Preparing to unpack .../27-libpciaccess0_0.17-3ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:56.9876579Z Unpacking libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:57.0211879Z Selecting previously unselected package libdrm-intel1:amd64.
|
|
||||||
2026-06-27T12:29:57.0307871Z Preparing to unpack .../28-libdrm-intel1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.0351988Z Unpacking libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:29:57.0748134Z Selecting previously unselected package libfontenc1:amd64.
|
|
||||||
2026-06-27T12:29:57.0777424Z Preparing to unpack .../29-libfontenc1_1%3a1.1.8-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.0825973Z Unpacking libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:29:57.1267005Z Selecting previously unselected package libllvm20:amd64.
|
|
||||||
2026-06-27T12:29:57.1293565Z Preparing to unpack .../30-libllvm20_1%3a20.1.2-0ubuntu1~24.04.3_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.1334840Z Unpacking libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:29:57.8980898Z Selecting previously unselected package libx11-xcb1:amd64.
|
|
||||||
2026-06-27T12:29:57.9057528Z Preparing to unpack .../31-libx11-xcb1_2%3a1.8.7-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.9083148Z Unpacking libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:29:57.9349231Z Selecting previously unselected package libxcb-dri3-0:amd64.
|
|
||||||
2026-06-27T12:29:57.9385913Z Preparing to unpack .../32-libxcb-dri3-0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.9417344Z Unpacking libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:57.9715654Z Selecting previously unselected package libxcb-present0:amd64.
|
|
||||||
2026-06-27T12:29:57.9716511Z Preparing to unpack .../33-libxcb-present0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:57.9734621Z Unpacking libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:57.9990875Z Selecting previously unselected package libxcb-randr0:amd64.
|
|
||||||
2026-06-27T12:29:58.0027302Z Preparing to unpack .../34-libxcb-randr0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.0064111Z Unpacking libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:58.0358335Z Selecting previously unselected package libxcb-sync1:amd64.
|
|
||||||
2026-06-27T12:29:58.0377266Z Preparing to unpack .../35-libxcb-sync1_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.0404159Z Unpacking libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:58.0702568Z Selecting previously unselected package libxcb-xfixes0:amd64.
|
|
||||||
2026-06-27T12:29:58.0735170Z Preparing to unpack .../36-libxcb-xfixes0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.0767209Z Unpacking libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:58.1076190Z Selecting previously unselected package libxshmfence1:amd64.
|
|
||||||
2026-06-27T12:29:58.1106936Z Preparing to unpack .../37-libxshmfence1_1.3-1build5_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.1152686Z Unpacking libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:29:58.1441558Z Selecting previously unselected package mesa-libgallium:amd64.
|
|
||||||
2026-06-27T12:29:58.1467943Z Preparing to unpack .../38-mesa-libgallium_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.1528453Z Unpacking mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:58.3677723Z Selecting previously unselected package libgbm1:amd64.
|
|
||||||
2026-06-27T12:29:58.3739343Z Preparing to unpack .../39-libgbm1_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.3781464Z Unpacking libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:58.4160413Z Selecting previously unselected package libvulkan1:amd64.
|
|
||||||
2026-06-27T12:29:58.4187257Z Preparing to unpack .../40-libvulkan1_1.3.275.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.4211230Z Unpacking libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:29:58.4577990Z Selecting previously unselected package libgl1-mesa-dri:amd64.
|
|
||||||
2026-06-27T12:29:58.4595883Z Preparing to unpack .../41-libgl1-mesa-dri_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.4660743Z Unpacking libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:58.4939126Z Selecting previously unselected package libxcb-glx0:amd64.
|
|
||||||
2026-06-27T12:29:58.4968840Z Preparing to unpack .../42-libxcb-glx0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.5005512Z Unpacking libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:58.5308734Z Selecting previously unselected package libxxf86vm1:amd64.
|
|
||||||
2026-06-27T12:29:58.5330256Z Preparing to unpack .../43-libxxf86vm1_1%3a1.1.4-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.5350775Z Unpacking libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:29:58.6256611Z Selecting previously unselected package libglx-mesa0:amd64.
|
|
||||||
2026-06-27T12:29:58.6257251Z Preparing to unpack .../44-libglx-mesa0_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.6304189Z Unpacking libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:58.7458115Z Selecting previously unselected package libnspr4:amd64.
|
|
||||||
2026-06-27T12:29:58.7495398Z Preparing to unpack .../45-libnspr4_2%3a4.35-1.1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.7508426Z Unpacking libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:29:58.7856922Z Selecting previously unselected package libnss3:amd64.
|
|
||||||
2026-06-27T12:29:58.7886591Z Preparing to unpack .../46-libnss3_2%3a3.98-1ubuntu0.1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.7907591Z Unpacking libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:29:58.8538244Z Selecting previously unselected package libxmu6:amd64.
|
|
||||||
2026-06-27T12:29:58.8557712Z Preparing to unpack .../47-libxmu6_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.8628175Z Unpacking libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:29:58.9358779Z Selecting previously unselected package libxpm4:amd64.
|
|
||||||
2026-06-27T12:29:58.9378349Z Preparing to unpack .../48-libxpm4_1%3a3.5.17-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.9405841Z Unpacking libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:29:58.9713095Z Selecting previously unselected package libxaw7:amd64.
|
|
||||||
2026-06-27T12:29:58.9749998Z Preparing to unpack .../49-libxaw7_2%3a1.0.14-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:58.9788039Z Unpacking libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:29:59.0344842Z Selecting previously unselected package libxcomposite1:amd64.
|
|
||||||
2026-06-27T12:29:59.0385144Z Preparing to unpack .../50-libxcomposite1_1%3a0.4.5-1build3_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.0412966Z Unpacking libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:29:59.1108472Z Selecting previously unselected package libxdamage1:amd64.
|
|
||||||
2026-06-27T12:29:59.1138027Z Preparing to unpack .../51-libxdamage1_1%3a1.1.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.1198034Z Unpacking libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:29:59.1507633Z Selecting previously unselected package libxfixes3:amd64.
|
|
||||||
2026-06-27T12:29:59.1538920Z Preparing to unpack .../52-libxfixes3_1%3a6.0.0-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.1588705Z Unpacking libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:29:59.1948055Z Selecting previously unselected package libxfont2:amd64.
|
|
||||||
2026-06-27T12:29:59.1976643Z Preparing to unpack .../53-libxfont2_1%3a2.0.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.2025517Z Unpacking libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:29:59.2348606Z Selecting previously unselected package libxkbfile1:amd64.
|
|
||||||
2026-06-27T12:29:59.2397660Z Preparing to unpack .../54-libxkbfile1_1%3a1.1.0-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.2407377Z Unpacking libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:29:59.2679911Z Selecting previously unselected package libxrandr2:amd64.
|
|
||||||
2026-06-27T12:29:59.2680471Z Preparing to unpack .../55-libxrandr2_2%3a1.5.2-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.2704669Z Unpacking libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:29:59.2928745Z Selecting previously unselected package x11-xkb-utils.
|
|
||||||
2026-06-27T12:29:59.3010587Z Preparing to unpack .../56-x11-xkb-utils_7.7+8build2_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.3016591Z Unpacking x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:29:59.3398898Z Selecting previously unselected package xfonts-encodings.
|
|
||||||
2026-06-27T12:29:59.3429169Z Preparing to unpack .../57-xfonts-encodings_1%3a1.0.5-0ubuntu2_all.deb ...
|
|
||||||
2026-06-27T12:29:59.3448993Z Unpacking xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:29:59.3848305Z Selecting previously unselected package xfonts-utils.
|
|
||||||
2026-06-27T12:29:59.3872902Z Preparing to unpack .../58-xfonts-utils_1%3a7.7+6build3_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.3925392Z Unpacking xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:29:59.4504135Z Selecting previously unselected package xfonts-cyrillic.
|
|
||||||
2026-06-27T12:29:59.4553841Z Preparing to unpack .../59-xfonts-cyrillic_1%3a1.0.5+nmu1_all.deb ...
|
|
||||||
2026-06-27T12:29:59.4587260Z Unpacking xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:29:59.5071994Z Selecting previously unselected package xfonts-scalable.
|
|
||||||
2026-06-27T12:29:59.5148773Z Preparing to unpack .../60-xfonts-scalable_1%3a1.0.3-1.3_all.deb ...
|
|
||||||
2026-06-27T12:29:59.5188958Z Unpacking xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:29:59.5761382Z Selecting previously unselected package xserver-common.
|
|
||||||
2026-06-27T12:29:59.5797149Z Preparing to unpack .../61-xserver-common_2%3a21.1.12-1ubuntu1.6_all.deb ...
|
|
||||||
2026-06-27T12:29:59.5833113Z Unpacking xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:29:59.6297941Z Selecting previously unselected package libglvnd0:amd64.
|
|
||||||
2026-06-27T12:29:59.6317132Z Preparing to unpack .../62-libglvnd0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.6375824Z Unpacking libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:29:59.6898217Z Selecting previously unselected package libglx0:amd64.
|
|
||||||
2026-06-27T12:29:59.6987434Z Preparing to unpack .../63-libglx0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.7041170Z Unpacking libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:29:59.7538201Z Selecting previously unselected package libgl1:amd64.
|
|
||||||
2026-06-27T12:29:59.7567367Z Preparing to unpack .../64-libgl1_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.7608379Z Unpacking libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:29:59.8027844Z Selecting previously unselected package xvfb.
|
|
||||||
2026-06-27T12:29:59.8051105Z Preparing to unpack .../65-xvfb_2%3a21.1.12-1ubuntu1.6_amd64.deb ...
|
|
||||||
2026-06-27T12:29:59.8115409Z Unpacking xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:29:59.8815864Z Setting up libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:59.8917302Z Setting up libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:29:59.9001648Z Setting up libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:29:59.9127426Z Setting up libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:29:59.9207499Z Setting up libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:29:59.9297509Z Setting up libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:59.9369956Z Setting up libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:29:59.9476533Z Setting up libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:29:59.9547162Z Setting up fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:29:59.9657561Z Setting up libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:29:59.9723581Z Setting up libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:29:59.9789575Z Setting up libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:29:59.9977819Z Setting up fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:30:00.0344505Z Setting up fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:30:00.0438186Z Setting up xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:30:00.0519182Z Setting up libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:30:00.0632646Z Setting up libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:30:00.0728864Z Setting up libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:30:00.0825264Z Setting up libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:30:00.0943785Z Setting up libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:30:00.1057780Z Setting up libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:30:00.1186853Z Setting up fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:30:00.1286620Z Setting up libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:30:00.1429741Z Setting up libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:30:00.1564533Z Setting up libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:30:00.1648849Z Setting up libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:30:00.1749059Z Setting up libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.1828573Z Setting up xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:30:00.1906805Z Setting up libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:30:00.1978076Z Setting up libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:30:00.2061550Z Setting up libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:30:00.2199197Z Setting up libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.2301105Z Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:30:00.2493099Z update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
|
|
||||||
2026-06-27T12:30:00.2582540Z Setting up libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:30:00.2699468Z Setting up at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.2828103Z Setting up libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:30:00.2958465Z Setting up fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:30:00.3047180Z Setting up libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:30:00.3169710Z Setting up libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.3255670Z Setting up libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:30:00.3368403Z Setting up libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:30:00.3481429Z Setting up libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:30:00.3568481Z Setting up fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:30:00.3688733Z Setting up libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.3780829Z Setting up libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.3892898Z Setting up x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:30:00.3955583Z Setting up libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:30:00.4018202Z Setting up libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:30:00.4091025Z Setting up xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:30:00.4200703Z Setting up libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.4253545Z Setting up xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:30:00.4311946Z Setting up xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:30:00.4811643Z Setting up xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:30:00.4891341Z Setting up libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:30:00.4975965Z Setting up xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:30:00.5435339Z Setting up libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.5508959Z Setting up libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.5598180Z Setting up libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.5698547Z Setting up libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:30:00.5809612Z Setting up mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.5890583Z Setting up libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.5946424Z Setting up libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.6113114Z Setting up libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:30:00.6230623Z Setting up libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.6358249Z Setting up libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:30:00.6476917Z Setting up xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:30:00.6588145Z Processing triggers for fontconfig (2.15.0-1.1ubuntu2) ...
|
|
||||||
2026-06-27T12:30:00.7725048Z Processing triggers for libc-bin (2.39-0ubuntu8.7) ...
|
|
||||||
2026-06-27T12:30:01.2294434Z ::group::Run set -e
|
|
||||||
2026-06-27T12:30:01.2294765Z set -e
|
|
||||||
2026-06-27T12:30:01.2294873Z EXPECTED_VERSION="$(git rev-parse --short HEAD)"
|
|
||||||
2026-06-27T12:30:01.2294970Z for i in $(seq 1 60); do
|
|
||||||
2026-06-27T12:30:01.2295049Z VERSION_BODY="$(curl -fsS "http://${DEPLOY_HOST}/taxbaik/version.txt" || true)"
|
|
||||||
2026-06-27T12:30:01.2295148Z BLOG_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/blog/accountant-mistakes-5" || true)"
|
|
||||||
2026-06-27T12:30:01.2295260Z if echo "$VERSION_BODY" | grep -q "Version: ${EXPECTED_VERSION}" && [ "$BLOG_STATUS" = "200" ]; then
|
|
||||||
2026-06-27T12:30:01.2295356Z echo "Deployment is ready for ${EXPECTED_VERSION}"
|
|
||||||
2026-06-27T12:30:01.2295435Z exit 0
|
|
||||||
2026-06-27T12:30:01.2295546Z fi
|
|
||||||
2026-06-27T12:30:01.2295634Z echo "Waiting for deployment ${EXPECTED_VERSION}; blog status=${BLOG_STATUS}; version=${VERSION_BODY}"
|
|
||||||
2026-06-27T12:30:01.2295732Z sleep 10
|
|
||||||
2026-06-27T12:30:01.2295818Z done
|
|
||||||
2026-06-27T12:30:01.2295888Z echo "Deployment did not publish expected version ${EXPECTED_VERSION} in time" >&2
|
|
||||||
2026-06-27T12:30:01.2295977Z exit 1
|
|
||||||
2026-06-27T12:30:01.2296048Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:30:01.2296336Z env:
|
|
||||||
2026-06-27T12:30:01.2296411Z DEPLOY_HOST: ***
|
|
||||||
2026-06-27T12:30:01.2296493Z ::endgroup::
|
|
||||||
2026-06-27T12:30:01.3254169Z Waiting for deployment a58aa7e; blog status=200; version=Version: 9f7e016
|
|
||||||
2026-06-27T12:30:01.3255216Z Built: 2026-06-27 12:25:52 UTC
|
|
||||||
2026-06-27T12:30:11.4042857Z Waiting for deployment a58aa7e; blog status=200; version=Version: 9f7e016
|
|
||||||
2026-06-27T12:30:11.4043666Z Built: 2026-06-27 12:25:52 UTC
|
|
||||||
2026-06-27T12:30:21.4167471Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:30:21.4277572Z Waiting for deployment a58aa7e; blog status=502; version=
|
|
||||||
2026-06-27T12:30:31.4431020Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:30:31.4639354Z Waiting for deployment a58aa7e; blog status=502; version=
|
|
||||||
2026-06-27T12:30:41.5808920Z Deployment is ready for a58aa7e
|
|
||||||
2026-06-27T12:30:41.7045667Z ::group::Run npm run test:e2e
|
|
||||||
2026-06-27T12:30:41.7046302Z npm run test:e2e
|
|
||||||
2026-06-27T12:30:41.7046499Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:30:41.7046695Z env:
|
|
||||||
2026-06-27T12:30:41.7046797Z E2E_BASE_URL: http://***/taxbaik
|
|
||||||
2026-06-27T12:30:41.7046897Z E2E_ADMIN_USERNAME: admin
|
|
||||||
2026-06-27T12:30:41.7046972Z E2E_ADMIN_PASSWORD: ***
|
|
||||||
2026-06-27T12:30:41.7047051Z ::endgroup::
|
|
||||||
2026-06-27T12:30:41.9109487Z
|
|
||||||
2026-06-27T12:30:41.9110189Z > test:e2e
|
|
||||||
2026-06-27T12:30:41.9110310Z > playwright test
|
|
||||||
2026-06-27T12:30:41.9110396Z
|
|
||||||
2026-06-27T12:30:43.8046225Z
|
|
||||||
2026-06-27T12:30:43.8046928Z Running 8 tests using 1 worker
|
|
||||||
2026-06-27T12:30:43.8050479Z
|
|
||||||
2026-06-27T12:30:48.0177348Z ✓ 1 [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard (2.5s)
|
|
||||||
2026-06-27T12:30:48.2915426Z - 2 [chromium] › tests/e2e/admin-password-change.spec.ts:10:7 › admin password change › changes password through the real admin UI
|
|
||||||
2026-06-27T12:31:11.0534606Z ✘ 3 [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors (22.6s)
|
|
||||||
2026-06-27T12:31:35.0777222Z ✘ 4 [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors (retry #1) (23.0s)
|
|
||||||
2026-06-27T12:31:37.0886042Z ✓ 5 [chromium] › tests/e2e/blog-seo.spec.ts:6:7 › blog seo › exposes title description and canonical on blog detail pages (1.2s)
|
|
||||||
2026-06-27T12:31:37.1698892Z ✓ 6 [chromium] › tests/e2e/contact-submit.spec.ts:9:7 › contact submit › creates an inquiry through the public API (56ms)
|
|
||||||
2026-06-27T12:32:08.5039961Z ✘ 7 [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list (31.2s)
|
|
||||||
2026-06-27T12:32:33.1123930Z ✘ 8 [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list (retry #1) (23.6s)
|
|
||||||
2026-06-27T12:32:46.3480272Z ✘ 9 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (12.2s)
|
|
||||||
2026-06-27T12:32:59.5966610Z ✘ 10 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (retry #1) (12.3s)
|
|
||||||
2026-06-27T12:33:02.1968464Z ✓ 11 [chromium] › tests/e2e/public-smoke.spec.ts:6:7 › public smoke › loads the main public pages with SEO basics (1.8s)
|
|
||||||
2026-06-27T12:33:02.2524349Z
|
|
||||||
2026-06-27T12:33:02.2531287Z
|
|
||||||
2026-06-27T12:33:02.2545075Z 1) [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors
|
|
||||||
2026-06-27T12:33:02.2545755Z
|
|
||||||
2026-06-27T12:33:02.2545909Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2547433Z
|
|
||||||
2026-06-27T12:33:02.2547631Z Locator: locator('.mud-main-content').getByText(/이번달 문의/).first()
|
|
||||||
2026-06-27T12:33:02.2547801Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2548037Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:33:02.2548148Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2548252Z
|
|
||||||
2026-06-27T12:33:02.2548343Z Call log:
|
|
||||||
2026-06-27T12:33:02.2548577Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:33:02.2548699Z [2m - waiting for locator('.mud-main-content').getByText(/이번달 문의/).first()[22m
|
|
||||||
2026-06-27T12:33:02.2548836Z
|
|
||||||
2026-06-27T12:33:02.2548926Z
|
|
||||||
2026-06-27T12:33:02.2549044Z 32 | await page.goto(`${baseUrl}${check.path}`);
|
|
||||||
2026-06-27T12:33:02.2549157Z 33 | await expect(page).toHaveURL(new RegExp(`${check.path}$`));
|
|
||||||
2026-06-27T12:33:02.2549284Z > 34 | await expect(page.locator('.mud-main-content').getByText(check.content).first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:33:02.2549443Z | ^
|
|
||||||
2026-06-27T12:33:02.2549564Z 35 | }
|
|
||||||
2026-06-27T12:33:02.2549660Z 36 |
|
|
||||||
2026-06-27T12:33:02.2549761Z 37 | expect(consoleErrors, 'browser console/page errors').toEqual([]);
|
|
||||||
2026-06-27T12:33:02.2549890Z at /workspace/***/taxbaik/tests/e2e/admin-smoke.spec.ts:34:88
|
|
||||||
2026-06-27T12:33:02.2550023Z
|
|
||||||
2026-06-27T12:33:02.2550178Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2550366Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2550570Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2550741Z
|
|
||||||
2026-06-27T12:33:02.2550871Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2551052Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/video.webm
|
|
||||||
2026-06-27T12:33:02.2551185Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2551346Z
|
|
||||||
2026-06-27T12:33:02.2551477Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2551622Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2551734Z Usage:
|
|
||||||
2026-06-27T12:33:02.2551838Z
|
|
||||||
2026-06-27T12:33:02.2551951Z npx playwright show-trace test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2552089Z
|
|
||||||
2026-06-27T12:33:02.2552180Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2552352Z
|
|
||||||
2026-06-27T12:33:02.2552705Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2552879Z
|
|
||||||
2026-06-27T12:33:02.2552985Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2553138Z
|
|
||||||
2026-06-27T12:33:02.2553264Z Locator: locator('.mud-main-content').getByText(/이번달 문의/).first()
|
|
||||||
2026-06-27T12:33:02.2553424Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2553606Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:33:02.2553767Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2553930Z
|
|
||||||
2026-06-27T12:33:02.2554063Z Call log:
|
|
||||||
2026-06-27T12:33:02.2554230Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:33:02.2554388Z [2m - waiting for locator('.mud-main-content').getByText(/이번달 문의/).first()[22m
|
|
||||||
2026-06-27T12:33:02.2554539Z
|
|
||||||
2026-06-27T12:33:02.2554701Z
|
|
||||||
2026-06-27T12:33:02.2554856Z 32 | await page.goto(`${baseUrl}${check.path}`);
|
|
||||||
2026-06-27T12:33:02.2555020Z 33 | await expect(page).toHaveURL(new RegExp(`${check.path}$`));
|
|
||||||
2026-06-27T12:33:02.2555200Z > 34 | await expect(page.locator('.mud-main-content').getByText(check.content).first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:33:02.2555419Z | ^
|
|
||||||
2026-06-27T12:33:02.2555591Z 35 | }
|
|
||||||
2026-06-27T12:33:02.2555723Z 36 |
|
|
||||||
2026-06-27T12:33:02.2555884Z 37 | expect(consoleErrors, 'browser console/page errors').toEqual([]);
|
|
||||||
2026-06-27T12:33:02.2556012Z at /workspace/***/taxbaik/tests/e2e/admin-smoke.spec.ts:34:88
|
|
||||||
2026-06-27T12:33:02.2556425Z
|
|
||||||
2026-06-27T12:33:02.2556578Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2556826Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2557065Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2557269Z
|
|
||||||
2026-06-27T12:33:02.2557459Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2557681Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:33:02.2557852Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2558051Z
|
|
||||||
2026-06-27T12:33:02.2558201Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2558410Z test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2558562Z Usage:
|
|
||||||
2026-06-27T12:33:02.2558720Z
|
|
||||||
2026-06-27T12:33:02.2558865Z npx playwright show-trace test-results/admin-smoke-admin-smoke-na-bbce9-enus-without-circuit-errors-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2559018Z
|
|
||||||
2026-06-27T12:33:02.2559090Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2559220Z
|
|
||||||
2026-06-27T12:33:02.2561056Z 2) [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list
|
|
||||||
2026-06-27T12:33:02.2561492Z
|
|
||||||
2026-06-27T12:33:02.2561598Z [31mTest timeout of 30000ms exceeded.[39m
|
|
||||||
2026-06-27T12:33:02.2562083Z
|
|
||||||
2026-06-27T12:33:02.2562226Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2562342Z
|
|
||||||
2026-06-27T12:33:02.2562694Z Locator: locator('.mud-main-content').getByText('문의 관리').first()
|
|
||||||
2026-06-27T12:33:02.2562800Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2562878Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2562949Z
|
|
||||||
2026-06-27T12:33:02.2563044Z Call log:
|
|
||||||
2026-06-27T12:33:02.2563126Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:33:02.2563214Z [2m - waiting for locator('.mud-main-content').getByText('문의 관리').first()[22m
|
|
||||||
2026-06-27T12:33:02.2563313Z
|
|
||||||
2026-06-27T12:33:02.2563378Z
|
|
||||||
2026-06-27T12:33:02.2563458Z 51 | await loginThroughAdminUi(page, baseUrl, username, password);
|
|
||||||
2026-06-27T12:33:02.2563544Z 52 | await page.goto(`${baseUrl}/admin/inquiries`);
|
|
||||||
2026-06-27T12:33:02.2563685Z > 53 | await expect(page.locator('.mud-main-content').getByText('문의 관리').first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:33:02.2563793Z | ^
|
|
||||||
2026-06-27T12:33:02.2563877Z 54 | });
|
|
||||||
2026-06-27T12:33:02.2563959Z 55 | });
|
|
||||||
2026-06-27T12:33:02.2564031Z 56 |
|
|
||||||
2026-06-27T12:33:02.2564102Z at /workspace/***/taxbaik/tests/e2e/contact-submit.spec.ts:53:80
|
|
||||||
2026-06-27T12:33:02.2564189Z
|
|
||||||
2026-06-27T12:33:02.2564665Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2564824Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2564924Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2565086Z
|
|
||||||
2026-06-27T12:33:02.2565264Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2565612Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/video.webm
|
|
||||||
2026-06-27T12:33:02.2565790Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2565968Z
|
|
||||||
2026-06-27T12:33:02.2566036Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2566448Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2566566Z Usage:
|
|
||||||
2026-06-27T12:33:02.2566640Z
|
|
||||||
2026-06-27T12:33:02.2566803Z npx playwright show-trace test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2567001Z
|
|
||||||
2026-06-27T12:33:02.2567250Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2567454Z
|
|
||||||
2026-06-27T12:33:02.2567634Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2567917Z
|
|
||||||
2026-06-27T12:33:02.2568054Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2568190Z
|
|
||||||
2026-06-27T12:33:02.2568258Z Locator: locator('.mud-main-content').getByText('문의 관리').first()
|
|
||||||
2026-06-27T12:33:02.2568382Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2568511Z Timeout: 20000ms
|
|
||||||
2026-06-27T12:33:02.2568719Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2568899Z
|
|
||||||
2026-06-27T12:33:02.2569009Z Call log:
|
|
||||||
2026-06-27T12:33:02.2569138Z [2m - Expect "toBeVisible" with timeout 20000ms[22m
|
|
||||||
2026-06-27T12:33:02.2569294Z [2m - waiting for locator('.mud-main-content').getByText('문의 관리').first()[22m
|
|
||||||
2026-06-27T12:33:02.2569504Z
|
|
||||||
2026-06-27T12:33:02.2569628Z
|
|
||||||
2026-06-27T12:33:02.2569753Z 51 | await loginThroughAdminUi(page, baseUrl, username, password);
|
|
||||||
2026-06-27T12:33:02.2569892Z 52 | await page.goto(`${baseUrl}/admin/inquiries`);
|
|
||||||
2026-06-27T12:33:02.2569976Z > 53 | await expect(page.locator('.mud-main-content').getByText('문의 관리').first()).toBeVisible({ timeout: 20_000 });
|
|
||||||
2026-06-27T12:33:02.2570072Z | ^
|
|
||||||
2026-06-27T12:33:02.2570155Z 54 | });
|
|
||||||
2026-06-27T12:33:02.2570252Z 55 | });
|
|
||||||
2026-06-27T12:33:02.2570325Z 56 |
|
|
||||||
2026-06-27T12:33:02.2570398Z at /workspace/***/taxbaik/tests/e2e/contact-submit.spec.ts:53:80
|
|
||||||
2026-06-27T12:33:02.2570519Z
|
|
||||||
2026-06-27T12:33:02.2570685Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2570950Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2571233Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2571528Z
|
|
||||||
2026-06-27T12:33:02.2571734Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2571969Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:33:02.2572189Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2572701Z
|
|
||||||
2026-06-27T12:33:02.2572875Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2573007Z test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2573164Z Usage:
|
|
||||||
2026-06-27T12:33:02.2573236Z
|
|
||||||
2026-06-27T12:33:02.2573316Z npx playwright show-trace test-results/contact-submit-contact-sub-0fd92--and-shows-it-in-admin-list-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2573497Z
|
|
||||||
2026-06-27T12:33:02.2573634Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2573839Z
|
|
||||||
2026-06-27T12:33:02.2573970Z 3) [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:33:02.2574089Z
|
|
||||||
2026-06-27T12:33:02.2574157Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2574251Z
|
|
||||||
2026-06-27T12:33:02.2574417Z Locator: getByText('Detail-1782563554052')
|
|
||||||
2026-06-27T12:33:02.2574630Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2574767Z Timeout: 10000ms
|
|
||||||
2026-06-27T12:33:02.2574896Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2575075Z
|
|
||||||
2026-06-27T12:33:02.2575189Z Call log:
|
|
||||||
2026-06-27T12:33:02.2575335Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:33:02.2575571Z [2m - waiting for getByText('Detail-1782563554052')[22m
|
|
||||||
2026-06-27T12:33:02.2575703Z
|
|
||||||
2026-06-27T12:33:02.2575787Z
|
|
||||||
2026-06-27T12:33:02.2575907Z 36 |
|
|
||||||
2026-06-27T12:33:02.2576443Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:33:02.2576618Z > 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2580360Z | ^
|
|
||||||
2026-06-27T12:33:02.2580564Z 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2580751Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2580953Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2581466Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:38:40
|
|
||||||
2026-06-27T12:33:02.2581734Z
|
|
||||||
2026-06-27T12:33:02.2582304Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2582750Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2583124Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2583293Z
|
|
||||||
2026-06-27T12:33:02.2583368Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2583479Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/video.webm
|
|
||||||
2026-06-27T12:33:02.2583602Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2583876Z
|
|
||||||
2026-06-27T12:33:02.2583952Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2584087Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2584245Z Usage:
|
|
||||||
2026-06-27T12:33:02.2584378Z
|
|
||||||
2026-06-27T12:33:02.2584476Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:33:02.2584793Z
|
|
||||||
2026-06-27T12:33:02.2584870Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2584975Z
|
|
||||||
2026-06-27T12:33:02.2585062Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2585181Z
|
|
||||||
2026-06-27T12:33:02.2585249Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:33:02.2585473Z
|
|
||||||
2026-06-27T12:33:02.2585583Z Locator: getByText('Detail-1782563567239')
|
|
||||||
2026-06-27T12:33:02.2585678Z Expected: visible
|
|
||||||
2026-06-27T12:33:02.2585754Z Timeout: 10000ms
|
|
||||||
2026-06-27T12:33:02.2585852Z Error: element(s) not found
|
|
||||||
2026-06-27T12:33:02.2585928Z
|
|
||||||
2026-06-27T12:33:02.2585992Z Call log:
|
|
||||||
2026-06-27T12:33:02.2586254Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:33:02.2586384Z [2m - waiting for getByText('Detail-1782563567239')[22m
|
|
||||||
2026-06-27T12:33:02.2586464Z
|
|
||||||
2026-06-27T12:33:02.2586529Z
|
|
||||||
2026-06-27T12:33:02.2586746Z 36 |
|
|
||||||
2026-06-27T12:33:02.2586860Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:33:02.2587263Z > 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2587352Z | ^
|
|
||||||
2026-06-27T12:33:02.2587457Z 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2587540Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2587629Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:33:02.2587733Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:38:40
|
|
||||||
2026-06-27T12:33:02.2588063Z
|
|
||||||
2026-06-27T12:33:02.2588139Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2588254Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:33:02.2588399Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2589026Z
|
|
||||||
2026-06-27T12:33:02.2589173Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2589377Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:33:02.2589531Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2589941Z
|
|
||||||
2026-06-27T12:33:02.2590016Z attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2590155Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2590240Z Usage:
|
|
||||||
2026-06-27T12:33:02.2590305Z
|
|
||||||
2026-06-27T12:33:02.2590387Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:33:02.2590758Z
|
|
||||||
2026-06-27T12:33:02.2590843Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:33:02.2590948Z
|
|
||||||
2026-06-27T12:33:02.2591071Z 3 failed
|
|
||||||
2026-06-27T12:33:02.2591147Z [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors
|
|
||||||
2026-06-27T12:33:02.2591241Z [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list
|
|
||||||
2026-06-27T12:33:02.2594170Z [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:33:02.2594319Z 1 skipped
|
|
||||||
2026-06-27T12:33:02.2594396Z 4 passed (2.3m)
|
|
||||||
2026-06-27T12:33:02.3292719Z ❌ Failure - Main Browser E2E verification
|
|
||||||
2026-06-27T12:33:02.3407069Z exitcode '1': failure
|
|
||||||
2026-06-27T12:33:02.4237692Z ::group::Run echo "Executed tests:"
|
|
||||||
2026-06-27T12:33:02.4238089Z echo "Executed tests:"
|
|
||||||
2026-06-27T12:33:02.4238203Z echo "- admin-login"
|
|
||||||
2026-06-27T12:33:02.4238288Z echo "- admin-smoke"
|
|
||||||
2026-06-27T12:33:02.4238374Z echo "- public-smoke"
|
|
||||||
2026-06-27T12:33:02.4238450Z echo "- blog-seo"
|
|
||||||
2026-06-27T12:33:02.4238523Z echo "- contact-submit"
|
|
||||||
2026-06-27T12:33:02.4238594Z echo "- inquiry-detail"
|
|
||||||
2026-06-27T12:33:02.4238663Z echo "- admin-password-change"
|
|
||||||
2026-06-27T12:33:02.4238739Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:33:02.4238836Z ::endgroup::
|
|
||||||
2026-06-27T12:33:02.4726718Z Executed tests:
|
|
||||||
2026-06-27T12:33:02.4727412Z - admin-login
|
|
||||||
2026-06-27T12:33:02.4727523Z - admin-smoke
|
|
||||||
2026-06-27T12:33:02.4727620Z - public-smoke
|
|
||||||
2026-06-27T12:33:02.4730668Z - blog-seo
|
|
||||||
2026-06-27T12:33:02.4730940Z - contact-submit
|
|
||||||
2026-06-27T12:33:02.4731066Z - inquiry-detail
|
|
||||||
2026-06-27T12:33:02.4731169Z - admin-password-change
|
|
||||||
2026-06-27T12:33:02.5034245Z expression '${{ runner.os }}-playwright-\n' rewritten to 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:33:02.5034624Z evaluating expression 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:33:02.5035263Z expression 'format('{0}-playwright-\n', runner.os)' evaluated to '%!t(string=Linux-playwright-\n)'
|
|
||||||
2026-06-27T12:33:02.5035477Z expression '${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}' rewritten to 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:33:02.5035585Z evaluating expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:33:02.5036023Z Writing entry to tarball workflow/hashfiles/index.js len:168437
|
|
||||||
2026-06-27T12:33:02.5038055Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:33:02.5066826Z 🐳 docker exec cmd=[node /var/run/act/workflow/hashfiles/index.js] user= workdir=
|
|
||||||
2026-06-27T12:33:02.5067069Z Exec command '[node /var/run/act/workflow/hashfiles/index.js]'
|
|
||||||
2026-06-27T12:33:02.5067254Z Working directory '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:33:02.6130490Z expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))' evaluated to '%!t(string=Linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f)'
|
|
||||||
2026-06-27T12:33:02.6222628Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:33:02.6223194Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:33:02.6223347Z Skipping step 'Cache Playwright browsers' due to 'success()'
|
|
||||||
2026-06-27T12:33:02.6495905Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:33:02.6496788Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:33:02.6496993Z Skipping step 'Setup Node.js' due to 'success()'
|
|
||||||
2026-06-27T12:33:02.6731068Z evaluating expression 'always()'
|
|
||||||
2026-06-27T12:33:02.6731572Z expression 'always()' evaluated to 'true'
|
|
||||||
2026-06-27T12:33:02.6731704Z ⭐ Run Post Checkout code
|
|
||||||
2026-06-27T12:33:02.6731911Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:33:02.6732075Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:33:02.6732180Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:33:02.6732274Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:33:02.6732355Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:33:02.6732618Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:33:02.6753720Z run post step for 'Checkout code'
|
|
||||||
2026-06-27T12:33:02.6754319Z executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]
|
|
||||||
2026-06-27T12:33:02.6992161Z 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir=
|
|
||||||
2026-06-27T12:33:02.6992721Z Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]'
|
|
||||||
2026-06-27T12:33:02.6993156Z Working directory '/workspace/***/taxbaik'
|
|
||||||
-776
@@ -1,776 +0,0 @@
|
|||||||
2026-06-27T12:42:01.6386894Z hz-prod-runner-2(version:v0.6.1) received task 270 of job browser-e2e, be triggered by event: push
|
|
||||||
2026-06-27T12:42:01.6396613Z workflow prepared
|
|
||||||
2026-06-27T12:42:01.6398704Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:42:01.6399563Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T12:42:01.6399754Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:42:01.6520723Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T12:42:01.6520983Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T12:42:01.6877959Z Image exists? true
|
|
||||||
2026-06-27T12:42:01.7509267Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:42:01.8735173Z Created container name=GITEA-ACTIONS-TASK-270-WORKFLOW-TaxBaik-Browser-E2E-JOB-browser-1a7ccf27222150b898262b9f6434702d14b01902006135d71a3535eab49f7b6d id=982b0f68e285f79ba36d4d0701d74eeea99659440d4c4ecce1608c6564098795 from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T12:42:01.8736490Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T12:42:01.8737047Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T12:42:01.8737327Z Starting container: 982b0f68e285f79ba36d4d0701d74eeea99659440d4c4ecce1608c6564098795
|
|
||||||
2026-06-27T12:42:02.1359887Z Started container: 982b0f68e285f79ba36d4d0701d74eeea99659440d4c4ecce1608c6564098795
|
|
||||||
2026-06-27T12:42:02.3790246Z Writing entry to tarball workflow/event.json len:5280
|
|
||||||
2026-06-27T12:42:02.3790832Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:42:02.3791000Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T12:42:02.4012853Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T12:42:02.4013315Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:42:03.0003869Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T12:42:03.0004261Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T12:42:03.0170721Z Checked out v4
|
|
||||||
2026-06-27T12:42:03.0281354Z ☁ git clone 'https://github.com/actions/setup-node' # ref=v4
|
|
||||||
2026-06-27T12:42:03.0281846Z cloning https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:42:04.0062532Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:42:04.0063352Z Cloned https://github.com/actions/setup-node to /root/.cache/act/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc
|
|
||||||
2026-06-27T12:42:04.0894172Z Checked out v4
|
|
||||||
2026-06-27T12:42:04.1081453Z ☁ git clone 'https://github.com/actions/cache' # ref=v4
|
|
||||||
2026-06-27T12:42:04.1082338Z cloning https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:42:05.1714832Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T12:42:05.1715383Z Cloned https://github.com/actions/cache to /root/.cache/act/6b4e4eb40e21c1bd02cb00a273f4d79af7c42205c1390e4e65c594ecd7a3696e
|
|
||||||
2026-06-27T12:42:05.1991055Z Checked out v4
|
|
||||||
2026-06-27T12:42:05.2278587Z evaluating expression ''
|
|
||||||
2026-06-27T12:42:05.2279122Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T12:42:05.2279244Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T12:42:05.2279432Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:42:05.2279589Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:42:05.2279696Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:42:05.2279790Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:42:05.2279870Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:42:05.2279974Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:42:05.2312103Z ::group::Run Checkout code
|
|
||||||
2026-06-27T12:42:06.0822754Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T12:42:06.0822922Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T12:42:06.0823350Z ::group::Getting Git version info
|
|
||||||
2026-06-27T12:42:06.0823482Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:42:06.0902223Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T12:42:06.1010380Z git version 2.54.0
|
|
||||||
2026-06-27T12:42:06.1081645Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.1147488Z Temporarily overriding HOME='/tmp/f4c0183f-62e7-4412-be65-07f3e2ab46a9' before making global git config changes
|
|
||||||
2026-06-27T12:42:06.1148124Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T12:42:06.1148261Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:42:06.1359311Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:42:06.1418742Z ::group::Initializing the repository
|
|
||||||
2026-06-27T12:42:06.1474526Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T12:42:06.1479903Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T12:42:06.1480214Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T12:42:06.1480483Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T12:42:06.1480703Z hint: call:
|
|
||||||
2026-06-27T12:42:06.1480853Z hint:
|
|
||||||
2026-06-27T12:42:06.1480993Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T12:42:06.1481142Z hint:
|
|
||||||
2026-06-27T12:42:06.1481276Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T12:42:06.1481367Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T12:42:06.1481477Z hint:
|
|
||||||
2026-06-27T12:42:06.1481576Z hint: git branch -m <name>
|
|
||||||
2026-06-27T12:42:06.1481655Z hint:
|
|
||||||
2026-06-27T12:42:06.1481723Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T12:42:06.1482595Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T12:42:06.1505611Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:42:06.1577597Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.1577889Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T12:42:06.1589531Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T12:42:06.1619903Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.1621291Z ::group::Setting up auth
|
|
||||||
2026-06-27T12:42:06.1636909Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T12:42:06.1707066Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T12:42:06.2785700Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T12:42:06.2869237Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T12:42:06.3698626Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T12:42:06.3700619Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T12:42:06.4085787Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T12:42:06.4120486Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.4120806Z ::group::Fetching the repository
|
|
||||||
2026-06-27T12:42:06.4120949Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +0c49e12fa0fc23b036bbc8dee75093d4a85b3d76:refs/remotes/origin/master
|
|
||||||
2026-06-27T12:42:06.5987617Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T12:42:06.5988267Z * [new ref] 0c49e12fa0fc23b036bbc8dee75093d4a85b3d76 -> origin/master
|
|
||||||
2026-06-27T12:42:06.6167946Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.6168185Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T12:42:06.6168365Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.6169527Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T12:42:06.6260145Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T12:42:06.6260922Z ::group::Checking out the ref
|
|
||||||
2026-06-27T12:42:06.6261061Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T12:42:06.6388475Z Reset branch 'master'
|
|
||||||
2026-06-27T12:42:06.6389089Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T12:42:06.6390090Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.6491410Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T12:42:06.6491547Z 0c49e12fa0fc23b036bbc8dee75093d4a85b3d76
|
|
||||||
2026-06-27T12:42:06.6492312Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T12:42:06.6624647Z ::endgroup::
|
|
||||||
2026-06-27T12:42:06.7413480Z ::group::Run Setup Node.js
|
|
||||||
2026-06-27T12:42:06.7413874Z with:
|
|
||||||
2026-06-27T12:42:06.7413979Z cache: npm
|
|
||||||
2026-06-27T12:42:06.7414076Z node-version: 22
|
|
||||||
2026-06-27T12:42:07.8937720Z Found in cache @ /opt/hostedtoolcache/node/22.23.1/x64
|
|
||||||
2026-06-27T12:42:07.8949175Z (node:141) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:42:07.8949935Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:42:07.8967820Z ::group::Environment details
|
|
||||||
2026-06-27T12:42:08.1615731Z node: v22.23.1
|
|
||||||
2026-06-27T12:42:08.1616400Z npm: 10.9.8
|
|
||||||
2026-06-27T12:42:08.1616511Z yarn:
|
|
||||||
2026-06-27T12:42:08.1619964Z ::endgroup::
|
|
||||||
2026-06-27T12:42:08.1663162Z [command]/opt/hostedtoolcache/node/22.23.1/x64/bin/npm config get cache
|
|
||||||
2026-06-27T12:42:08.4460517Z /root/.npm
|
|
||||||
2026-06-27T12:42:08.5309728Z Cache Size: ~3 MB (2871339 B)
|
|
||||||
2026-06-27T12:42:08.5351578Z [command]/usr/bin/tar -xf /tmp/2dd4e48b-472d-4f3a-a544-b26c6f1b0d51/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:42:08.5634529Z Cache restored successfully
|
|
||||||
2026-06-27T12:42:08.5644759Z Cache restored from key: node-cache-linux-x64-npm-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:42:08.5648316Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/tsc.json
|
|
||||||
2026-06-27T12:42:08.5650463Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-stylish.json
|
|
||||||
2026-06-27T12:42:08.5652549Z ##[add-matcher]/run/act/actions/e5877e7fc2f7e5000a2f22526584a2565cc2ae38cd26a9b1938dbca653b056cc/.github/eslint-compact.json
|
|
||||||
2026-06-27T12:42:08.5841243Z ::endgroup::
|
|
||||||
2026-06-27T12:42:08.8646431Z ::group::Run Cache Playwright browsers
|
|
||||||
2026-06-27T12:42:08.8647004Z with:
|
|
||||||
2026-06-27T12:42:08.8647176Z key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
|
||||||
2026-06-27T12:42:08.8647331Z path: ~/.cache/ms-playwright
|
|
||||||
2026-06-27T12:42:08.8647452Z restore-keys: ${{ runner.os }}-playwright-
|
|
||||||
2026-06-27T12:42:10.1096593Z (node:204) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T12:42:10.1097075Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T12:42:11.7373570Z Cache Size: ~247 MB (259214535 B)
|
|
||||||
2026-06-27T12:42:11.7906926Z [command]/usr/bin/tar -xf /tmp/8a35e074-42a1-41e7-a6db-5d90d2a72d9e/cache.tzst -P -C /workspace/***/taxbaik --use-compress-program unzstd
|
|
||||||
2026-06-27T12:42:13.9851947Z Cache restored successfully
|
|
||||||
2026-06-27T12:42:14.0534634Z Cache restored from key: linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f
|
|
||||||
2026-06-27T12:42:14.0822392Z ::endgroup::
|
|
||||||
2026-06-27T12:42:14.3070146Z ::group::Run set -e
|
|
||||||
2026-06-27T12:42:14.3070488Z set -e
|
|
||||||
2026-06-27T12:42:14.3070607Z npm ci
|
|
||||||
2026-06-27T12:42:14.3070684Z npx playwright install chromium --with-deps
|
|
||||||
2026-06-27T12:42:14.3070790Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:42:14.3070903Z ::endgroup::
|
|
||||||
2026-06-27T12:42:16.1634222Z
|
|
||||||
2026-06-27T12:42:16.1635023Z added 3 packages, and audited 4 packages in 2s
|
|
||||||
2026-06-27T12:42:16.1635720Z
|
|
||||||
2026-06-27T12:42:16.1635892Z found 0 vulnerabilities
|
|
||||||
2026-06-27T12:42:18.0684354Z Installing dependencies...
|
|
||||||
2026-06-27T12:42:18.2404112Z Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
|
|
||||||
2026-06-27T12:42:18.2425817Z Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
|
|
||||||
2026-06-27T12:42:18.2750992Z Get:3 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B]
|
|
||||||
2026-06-27T12:42:18.3259169Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
|
|
||||||
2026-06-27T12:42:18.3637236Z Get:5 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble InRelease [24.3 kB]
|
|
||||||
2026-06-27T12:42:18.3834344Z Get:6 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
|
|
||||||
2026-06-27T12:42:18.3966479Z Get:7 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [976 kB]
|
|
||||||
2026-06-27T12:42:18.4887305Z Get:8 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [43.8 kB]
|
|
||||||
2026-06-27T12:42:18.4888027Z Get:9 https://packages.microsoft.com/ubuntu/24.04/prod noble/main all Packages [643 B]
|
|
||||||
2026-06-27T12:42:18.4954082Z Get:10 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [1339 kB]
|
|
||||||
2026-06-27T12:42:18.4967739Z Get:11 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [187 kB]
|
|
||||||
2026-06-27T12:42:18.5858529Z Get:12 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1487 kB]
|
|
||||||
2026-06-27T12:42:18.7430683Z Get:13 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
|
|
||||||
2026-06-27T12:42:18.8818902Z Get:14 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
|
|
||||||
2026-06-27T12:42:18.8819588Z Get:15 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
|
|
||||||
2026-06-27T12:42:18.9170162Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
|
|
||||||
2026-06-27T12:42:19.1169092Z Get:17 https://packagecloud.io/github/git-lfs/ubuntu noble InRelease [29.2 kB]
|
|
||||||
2026-06-27T12:42:19.3078630Z Get:18 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu noble/main amd64 Packages [2988 B]
|
|
||||||
2026-06-27T12:42:19.4341603Z Get:19 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [1296 kB]
|
|
||||||
2026-06-27T12:42:19.4717915Z Get:20 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [2108 kB]
|
|
||||||
2026-06-27T12:42:19.5288043Z Get:21 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [49.5 kB]
|
|
||||||
2026-06-27T12:42:19.5288557Z Get:22 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [1412 kB]
|
|
||||||
2026-06-27T12:42:19.5623728Z Get:23 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [48.9 kB]
|
|
||||||
2026-06-27T12:42:19.5672736Z Get:24 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [35.9 kB]
|
|
||||||
2026-06-27T12:42:19.5844853Z Get:25 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Packages [671 B]
|
|
||||||
2026-06-27T12:42:20.4121696Z Get:26 https://packagecloud.io/github/git-lfs/ubuntu noble/main amd64 Packages [1273 B]
|
|
||||||
2026-06-27T12:42:21.1150132Z Fetched 31.3 MB in 3s (10.6 MB/s)
|
|
||||||
2026-06-27T12:42:22.7485225Z Reading package lists...
|
|
||||||
2026-06-27T12:42:24.2863974Z Reading package lists...
|
|
||||||
2026-06-27T12:42:24.6997991Z Building dependency tree...
|
|
||||||
2026-06-27T12:42:24.6998606Z Reading state information...
|
|
||||||
2026-06-27T12:42:25.2667974Z libcairo2 is already the newest version (1.18.0-3build1).
|
|
||||||
2026-06-27T12:42:25.2669257Z libcairo2 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2669487Z libdbus-1-3 is already the newest version (1.14.10-4ubuntu4.1).
|
|
||||||
2026-06-27T12:42:25.2669628Z libdbus-1-3 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2669744Z libglib2.0-0t64 is already the newest version (2.80.0-6ubuntu3.8).
|
|
||||||
2026-06-27T12:42:25.2670167Z libglib2.0-0t64 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2670299Z libpango-1.0-0 is already the newest version (1.52.1+ds-1build1).
|
|
||||||
2026-06-27T12:42:25.2670419Z libpango-1.0-0 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2670555Z libx11-6 is already the newest version (2:1.8.7-1build1).
|
|
||||||
2026-06-27T12:42:25.2670881Z libx11-6 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2670995Z libxcb1 is already the newest version (1.15-1ubuntu2).
|
|
||||||
2026-06-27T12:42:25.2671180Z libxcb1 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2671321Z libxext6 is already the newest version (2:1.3.4-1build2).
|
|
||||||
2026-06-27T12:42:25.2671436Z libxext6 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2671721Z libfontconfig1 is already the newest version (2.15.0-1.1ubuntu2).
|
|
||||||
2026-06-27T12:42:25.2671880Z libfontconfig1 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2671987Z libfreetype6 is already the newest version (2.13.2+dfsg-1ubuntu0.1).
|
|
||||||
2026-06-27T12:42:25.2672111Z libfreetype6 set to manually installed.
|
|
||||||
2026-06-27T12:42:25.2672220Z The following additional packages will be installed:
|
|
||||||
2026-06-27T12:42:25.2673681Z at-spi2-common libasound2-data libavahi-client3 libavahi-common-data
|
|
||||||
2026-06-27T12:42:25.2674016Z libavahi-common3 libdrm-amdgpu1 libdrm-common libdrm-intel1 libfontenc1
|
|
||||||
2026-06-27T12:42:25.2676576Z libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:42:25.2696834Z libpciaccess0 libsensors-config libsensors5 libvulkan1 libx11-xcb1 libxaw7
|
|
||||||
2026-06-27T12:42:25.2697352Z libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-sync1
|
|
||||||
2026-06-27T12:42:25.2697650Z libxcb-xfixes0 libxfont2 libxi6 libxkbfile1 libxmu6 libxmuu1 libxpm4
|
|
||||||
2026-06-27T12:42:25.2697782Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:42:25.2697880Z xfonts-encodings xfonts-utils xkb-data xserver-common
|
|
||||||
2026-06-27T12:42:25.2710222Z Suggested packages:
|
|
||||||
2026-06-27T12:42:25.2712085Z alsa-utils libasound2-plugins cups-common pciutils lm-sensors
|
|
||||||
2026-06-27T12:42:25.2713861Z Recommended packages:
|
|
||||||
2026-06-27T12:42:25.2715730Z fonts-ipafont-mincho fonts-liberation-sans-narrow fonts-tlwg-loma
|
|
||||||
2026-06-27T12:42:25.2717316Z alsa-ucm-conf alsa-topology-conf at-spi2-core mesa-vulkan-drivers
|
|
||||||
2026-06-27T12:42:25.2718450Z | vulkan-icd xfonts-base
|
|
||||||
2026-06-27T12:42:25.4233747Z The following NEW packages will be installed:
|
|
||||||
2026-06-27T12:42:25.4237212Z at-spi2-common fonts-freefont-ttf fonts-ipafont-gothic fonts-liberation
|
|
||||||
2026-06-27T12:42:25.4241241Z fonts-noto-color-emoji fonts-tlwg-loma-otf fonts-unifont fonts-wqy-zenhei
|
|
||||||
2026-06-27T12:42:25.4243845Z libasound2-data libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64
|
|
||||||
2026-06-27T12:42:25.4245579Z libatspi2.0-0t64 libavahi-client3 libavahi-common-data libavahi-common3
|
|
||||||
2026-06-27T12:42:25.4247707Z libcups2t64 libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm2 libfontenc1
|
|
||||||
2026-06-27T12:42:25.4251351Z libgbm1 libgl1 libgl1-mesa-dri libglvnd0 libglx-mesa0 libglx0 libllvm20
|
|
||||||
2026-06-27T12:42:25.4258016Z libnspr4 libnss3 libpciaccess0 libsensors-config libsensors5 libvulkan1
|
|
||||||
2026-06-27T12:42:25.4259413Z libx11-xcb1 libxaw7 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0
|
|
||||||
2026-06-27T12:42:25.4263382Z libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxdamage1 libxfixes3 libxfont2
|
|
||||||
2026-06-27T12:42:25.4265183Z libxi6 libxkbcommon0 libxkbfile1 libxmu6 libxmuu1 libxpm4 libxrandr2
|
|
||||||
2026-06-27T12:42:25.4297330Z libxshmfence1 libxxf86vm1 mesa-libgallium x11-xkb-utils xauth
|
|
||||||
2026-06-27T12:42:25.4298896Z xfonts-cyrillic xfonts-encodings xfonts-scalable xfonts-utils xkb-data
|
|
||||||
2026-06-27T12:42:25.4300373Z xserver-common xvfb
|
|
||||||
2026-06-27T12:42:25.5129656Z 0 upgraded, 66 newly installed, 0 to remove and 52 not upgraded.
|
|
||||||
2026-06-27T12:42:25.5130411Z Need to get 79.3 MB of archives.
|
|
||||||
2026-06-27T12:42:25.5131004Z After this operation, 303 MB of additional disk space will be used.
|
|
||||||
2026-06-27T12:42:25.5131205Z Get:1 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3513 kB]
|
|
||||||
2026-06-27T12:42:25.6363669Z Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xkb-data all 2.41-2ubuntu1.1 [397 kB]
|
|
||||||
2026-06-27T12:42:25.6462726Z Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-common all 2.4.125-1ubuntu0.1~24.04.2 [9250 B]
|
|
||||||
2026-06-27T12:42:25.6545833Z Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm2 amd64 2.4.125-1ubuntu0.1~24.04.2 [41.4 kB]
|
|
||||||
2026-06-27T12:42:25.6632199Z Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors-config all 1:3.6.0-9build1 [5546 B]
|
|
||||||
2026-06-27T12:42:25.6735421Z Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 libsensors5 amd64 1:3.6.0-9build1 [26.6 kB]
|
|
||||||
2026-06-27T12:42:25.6929932Z Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbcommon0 amd64 1.6.0-1build1 [122 kB]
|
|
||||||
2026-06-27T12:42:25.6993201Z Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmuu1 amd64 2:1.1.3-3build2 [8958 B]
|
|
||||||
2026-06-27T12:42:25.7042021Z Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 xauth amd64 1:1.1.2-1build1 [25.6 kB]
|
|
||||||
2026-06-27T12:42:25.7107659Z Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 at-spi2-common all 2.52.0-1build1 [8674 B]
|
|
||||||
2026-06-27T12:42:25.7227545Z Get:11 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-freefont-ttf all 20211204+svn4273-2 [5641 kB]
|
|
||||||
2026-06-27T12:42:25.8255695Z Get:12 http://archive.ubuntu.com/ubuntu noble/main amd64 fonts-liberation all 1:2.1.5-3 [1603 kB]
|
|
||||||
2026-06-27T12:42:25.8379058Z Get:13 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 fonts-noto-color-emoji all 2.047-0ubuntu0.24.04.1 [9764 kB]
|
|
||||||
2026-06-27T12:42:25.9081985Z Get:14 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-tlwg-loma-otf all 1:0.7.3-1 [107 kB]
|
|
||||||
2026-06-27T12:42:25.9094890Z Get:15 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-unifont all 1:15.1.01-1build1 [2993 kB]
|
|
||||||
2026-06-27T12:42:25.9325207Z Get:16 http://archive.ubuntu.com/ubuntu noble/universe amd64 fonts-wqy-zenhei all 0.9.45-8 [7472 kB]
|
|
||||||
2026-06-27T12:42:26.1158222Z Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2-data all 1.2.11-1ubuntu0.2 [21.3 kB]
|
|
||||||
2026-06-27T12:42:26.1215127Z Get:18 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasound2t64 amd64 1.2.11-1ubuntu0.2 [398 kB]
|
|
||||||
2026-06-27T12:42:26.1355909Z Get:19 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk1.0-0t64 amd64 2.52.0-1build1 [55.3 kB]
|
|
||||||
2026-06-27T12:42:26.1358906Z Get:20 http://archive.ubuntu.com/ubuntu noble/main amd64 libxi6 amd64 2:1.8.1-1build1 [32.4 kB]
|
|
||||||
2026-06-27T12:42:26.1365902Z Get:21 http://archive.ubuntu.com/ubuntu noble/main amd64 libatspi2.0-0t64 amd64 2.52.0-1build1 [80.5 kB]
|
|
||||||
2026-06-27T12:42:26.1375497Z Get:22 http://archive.ubuntu.com/ubuntu noble/main amd64 libatk-bridge2.0-0t64 amd64 2.52.0-1build1 [66.0 kB]
|
|
||||||
2026-06-27T12:42:26.1387543Z Get:23 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common-data amd64 0.8-13ubuntu6.2 [30.1 kB]
|
|
||||||
2026-06-27T12:42:26.1407507Z Get:24 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-common3 amd64 0.8-13ubuntu6.2 [23.4 kB]
|
|
||||||
2026-06-27T12:42:26.1410460Z Get:25 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-client3 amd64 0.8-13ubuntu6.2 [26.8 kB]
|
|
||||||
2026-06-27T12:42:26.1445165Z Get:26 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libcups2t64 amd64 2.4.7-1.2ubuntu7.14 [274 kB]
|
|
||||||
2026-06-27T12:42:26.1639882Z Get:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-amdgpu1 amd64 2.4.125-1ubuntu0.1~24.04.2 [21.4 kB]
|
|
||||||
2026-06-27T12:42:26.1938526Z Get:28 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpciaccess0 amd64 0.17-3ubuntu0.24.04.2 [18.9 kB]
|
|
||||||
2026-06-27T12:42:26.2277831Z Get:29 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libdrm-intel1 amd64 2.4.125-1ubuntu0.1~24.04.2 [63.9 kB]
|
|
||||||
2026-06-27T12:42:26.2342459Z Get:30 http://archive.ubuntu.com/ubuntu noble/main amd64 libfontenc1 amd64 1:1.1.8-1build1 [14.0 kB]
|
|
||||||
2026-06-27T12:42:26.2369735Z Get:31 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libllvm20 amd64 1:20.1.2-0ubuntu1~24.04.3 [30.6 MB]
|
|
||||||
2026-06-27T12:42:26.5985620Z Get:32 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-xcb1 amd64 2:1.8.7-1build1 [7800 B]
|
|
||||||
2026-06-27T12:42:26.6020891Z Get:33 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-dri3-0 amd64 1.15-1ubuntu2 [7142 B]
|
|
||||||
2026-06-27T12:42:26.6039047Z Get:34 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-present0 amd64 1.15-1ubuntu2 [5676 B]
|
|
||||||
2026-06-27T12:42:26.6060223Z Get:35 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-randr0 amd64 1.15-1ubuntu2 [17.9 kB]
|
|
||||||
2026-06-27T12:42:26.6060579Z Get:36 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-sync1 amd64 1.15-1ubuntu2 [9312 B]
|
|
||||||
2026-06-27T12:42:26.6061065Z Get:37 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-xfixes0 amd64 1.15-1ubuntu2 [10.2 kB]
|
|
||||||
2026-06-27T12:42:26.6087470Z Get:38 http://archive.ubuntu.com/ubuntu noble/main amd64 libxshmfence1 amd64 1.3-1build5 [4764 B]
|
|
||||||
2026-06-27T12:42:26.6176211Z Get:39 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 mesa-libgallium amd64 25.2.8-0ubuntu0.24.04.2 [10.8 MB]
|
|
||||||
2026-06-27T12:42:26.7338875Z Get:40 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgbm1 amd64 25.2.8-0ubuntu0.24.04.2 [34.2 kB]
|
|
||||||
2026-06-27T12:42:26.7357574Z Get:41 http://archive.ubuntu.com/ubuntu noble/main amd64 libvulkan1 amd64 1.3.275.0-1build1 [142 kB]
|
|
||||||
2026-06-27T12:42:26.7361239Z Get:42 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libgl1-mesa-dri amd64 25.2.8-0ubuntu0.24.04.2 [37.9 kB]
|
|
||||||
2026-06-27T12:42:26.7369723Z Get:43 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb-glx0 amd64 1.15-1ubuntu2 [24.8 kB]
|
|
||||||
2026-06-27T12:42:26.7378251Z Get:44 http://archive.ubuntu.com/ubuntu noble/main amd64 libxxf86vm1 amd64 1:1.1.4-1build4 [9282 B]
|
|
||||||
2026-06-27T12:42:26.7397817Z Get:45 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libglx-mesa0 amd64 25.2.8-0ubuntu0.24.04.2 [110 kB]
|
|
||||||
2026-06-27T12:42:26.7508675Z Get:46 http://archive.ubuntu.com/ubuntu noble/main amd64 libnspr4 amd64 2:4.35-1.1build1 [117 kB]
|
|
||||||
2026-06-27T12:42:26.7576390Z Get:47 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss3 amd64 2:3.98-1ubuntu0.1 [1445 kB]
|
|
||||||
2026-06-27T12:42:26.7714931Z Get:48 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmu6 amd64 2:1.1.3-3build2 [47.6 kB]
|
|
||||||
2026-06-27T12:42:26.7795390Z Get:49 http://archive.ubuntu.com/ubuntu noble/main amd64 libxpm4 amd64 1:3.5.17-1build2 [36.5 kB]
|
|
||||||
2026-06-27T12:42:26.7882920Z Get:50 http://archive.ubuntu.com/ubuntu noble/main amd64 libxaw7 amd64 2:1.0.14-1build2 [187 kB]
|
|
||||||
2026-06-27T12:42:26.8006895Z Get:51 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcomposite1 amd64 1:0.4.5-1build3 [6320 B]
|
|
||||||
2026-06-27T12:42:26.8079162Z Get:52 http://archive.ubuntu.com/ubuntu noble/main amd64 libxdamage1 amd64 1:1.1.6-1build1 [6150 B]
|
|
||||||
2026-06-27T12:42:26.8314698Z Get:53 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfixes3 amd64 1:6.0.0-2build1 [10.8 kB]
|
|
||||||
2026-06-27T12:42:26.8323993Z Get:54 http://archive.ubuntu.com/ubuntu noble/main amd64 libxfont2 amd64 1:2.0.6-1build1 [93.0 kB]
|
|
||||||
2026-06-27T12:42:26.8355118Z Get:55 http://archive.ubuntu.com/ubuntu noble/main amd64 libxkbfile1 amd64 1:1.1.0-1build4 [70.0 kB]
|
|
||||||
2026-06-27T12:42:26.8410792Z Get:56 http://archive.ubuntu.com/ubuntu noble/main amd64 libxrandr2 amd64 2:1.5.2-2build1 [19.7 kB]
|
|
||||||
2026-06-27T12:42:26.8511647Z Get:57 http://archive.ubuntu.com/ubuntu noble/main amd64 x11-xkb-utils amd64 7.7+8build2 [170 kB]
|
|
||||||
2026-06-27T12:42:26.8618626Z Get:58 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 [578 kB]
|
|
||||||
2026-06-27T12:42:26.8680866Z Get:59 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-utils amd64 1:7.7+6build3 [94.4 kB]
|
|
||||||
2026-06-27T12:42:26.8762117Z Get:60 http://archive.ubuntu.com/ubuntu noble/universe amd64 xfonts-cyrillic all 1:1.0.5+nmu1 [384 kB]
|
|
||||||
2026-06-27T12:42:26.8847457Z Get:61 http://archive.ubuntu.com/ubuntu noble/main amd64 xfonts-scalable all 1:1.0.3-1.3 [304 kB]
|
|
||||||
2026-06-27T12:42:26.8969757Z Get:62 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 xserver-common all 2:21.1.12-1ubuntu1.6 [34.7 kB]
|
|
||||||
2026-06-27T12:42:26.9049558Z Get:63 http://archive.ubuntu.com/ubuntu noble/main amd64 libglvnd0 amd64 1.7.0-1build1 [69.6 kB]
|
|
||||||
2026-06-27T12:42:26.9134147Z Get:64 http://archive.ubuntu.com/ubuntu noble/main amd64 libglx0 amd64 1.7.0-1build1 [38.6 kB]
|
|
||||||
2026-06-27T12:42:26.9204845Z Get:65 http://archive.ubuntu.com/ubuntu noble/main amd64 libgl1 amd64 1.7.0-1build1 [102 kB]
|
|
||||||
2026-06-27T12:42:26.9278987Z Get:66 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 xvfb amd64 2:21.1.12-1ubuntu1.6 [877 kB]
|
|
||||||
2026-06-27T12:42:27.2488167Z debconf: delaying package configuration, since apt-utils is not installed
|
|
||||||
2026-06-27T12:42:27.3377255Z Fetched 79.3 MB in 1s (53.8 MB/s)
|
|
||||||
2026-06-27T12:42:27.3857288Z Selecting previously unselected package fonts-ipafont-gothic.
|
|
||||||
2026-06-27T12:42:27.6198133Z (Reading database ...
|
|
||||||
(Reading database ... 5%
|
|
||||||
(Reading database ... 10%
|
|
||||||
(Reading database ... 15%
|
|
||||||
(Reading database ... 20%
|
|
||||||
(Reading database ... 25%
|
|
||||||
(Reading database ... 30%
|
|
||||||
(Reading database ... 35%
|
|
||||||
(Reading database ... 40%
|
|
||||||
(Reading database ... 45%
|
|
||||||
(Reading database ... 50%
|
|
||||||
(Reading database ... 55%
|
|
||||||
(Reading database ... 60%
|
|
||||||
(Reading database ... 65%
|
|
||||||
(Reading database ... 70%
|
|
||||||
(Reading database ... 75%
|
|
||||||
(Reading database ... 80%
|
|
||||||
(Reading database ... 85%
|
|
||||||
(Reading database ... 90%
|
|
||||||
(Reading database ... 95%
|
|
||||||
(Reading database ... 100%
|
|
||||||
(Reading database ... 26518 files and directories currently installed.)
|
|
||||||
2026-06-27T12:42:27.6237768Z Preparing to unpack .../00-fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
|
|
||||||
2026-06-27T12:42:27.6421809Z Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:42:28.0078517Z Selecting previously unselected package xkb-data.
|
|
||||||
2026-06-27T12:42:28.0097698Z Preparing to unpack .../01-xkb-data_2.41-2ubuntu1.1_all.deb ...
|
|
||||||
2026-06-27T12:42:28.0129055Z Unpacking xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:42:28.1018280Z Selecting previously unselected package libdrm-common.
|
|
||||||
2026-06-27T12:42:28.1062798Z Preparing to unpack .../02-libdrm-common_2.4.125-1ubuntu0.1~24.04.2_all.deb ...
|
|
||||||
2026-06-27T12:42:28.1117916Z Unpacking libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:28.1551716Z Selecting previously unselected package libdrm2:amd64.
|
|
||||||
2026-06-27T12:42:28.1639777Z Preparing to unpack .../03-libdrm2_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:28.1685587Z Unpacking libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:28.2307747Z Selecting previously unselected package libsensors-config.
|
|
||||||
2026-06-27T12:42:28.2439684Z Preparing to unpack .../04-libsensors-config_1%3a3.6.0-9build1_all.deb ...
|
|
||||||
2026-06-27T12:42:28.2499526Z Unpacking libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:42:28.3078359Z Selecting previously unselected package libsensors5:amd64.
|
|
||||||
2026-06-27T12:42:28.3107541Z Preparing to unpack .../05-libsensors5_1%3a3.6.0-9build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:28.3819139Z Unpacking libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:42:28.4178488Z Selecting previously unselected package libxkbcommon0:amd64.
|
|
||||||
2026-06-27T12:42:28.4215092Z Preparing to unpack .../06-libxkbcommon0_1.6.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:28.4238014Z Unpacking libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:42:28.4713595Z Selecting previously unselected package libxmuu1:amd64.
|
|
||||||
2026-06-27T12:42:28.4768420Z Preparing to unpack .../07-libxmuu1_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:28.4804779Z Unpacking libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:42:28.5203908Z Selecting previously unselected package xauth.
|
|
||||||
2026-06-27T12:42:28.5265672Z Preparing to unpack .../08-xauth_1%3a1.1.2-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:28.5328178Z Unpacking xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:42:28.5718490Z Selecting previously unselected package at-spi2-common.
|
|
||||||
2026-06-27T12:42:28.5742146Z Preparing to unpack .../09-at-spi2-common_2.52.0-1build1_all.deb ...
|
|
||||||
2026-06-27T12:42:28.5828326Z Unpacking at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:28.6092093Z Selecting previously unselected package fonts-freefont-ttf.
|
|
||||||
2026-06-27T12:42:28.6116503Z Preparing to unpack .../10-fonts-freefont-ttf_20211204+svn4273-2_all.deb ...
|
|
||||||
2026-06-27T12:42:28.6150409Z Unpacking fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:42:28.8038588Z Selecting previously unselected package fonts-liberation.
|
|
||||||
2026-06-27T12:42:28.8048978Z Preparing to unpack .../11-fonts-liberation_1%3a2.1.5-3_all.deb ...
|
|
||||||
2026-06-27T12:42:28.8068328Z Unpacking fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:42:28.8689876Z Selecting previously unselected package fonts-noto-color-emoji.
|
|
||||||
2026-06-27T12:42:28.8755479Z Preparing to unpack .../12-fonts-noto-color-emoji_2.047-0ubuntu0.24.04.1_all.deb ...
|
|
||||||
2026-06-27T12:42:28.8787746Z Unpacking fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:42:28.9801867Z Selecting previously unselected package fonts-tlwg-loma-otf.
|
|
||||||
2026-06-27T12:42:28.9926938Z Preparing to unpack .../13-fonts-tlwg-loma-otf_1%3a0.7.3-1_all.deb ...
|
|
||||||
2026-06-27T12:42:28.9967629Z Unpacking fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:42:29.0458848Z Selecting previously unselected package fonts-unifont.
|
|
||||||
2026-06-27T12:42:29.0479928Z Preparing to unpack .../14-fonts-unifont_1%3a15.1.01-1build1_all.deb ...
|
|
||||||
2026-06-27T12:42:29.0505672Z Unpacking fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:42:29.2558792Z Selecting previously unselected package fonts-wqy-zenhei.
|
|
||||||
2026-06-27T12:42:29.2587773Z Preparing to unpack .../15-fonts-wqy-zenhei_0.9.45-8_all.deb ...
|
|
||||||
2026-06-27T12:42:29.2786634Z Unpacking fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:42:30.0317229Z Selecting previously unselected package libasound2-data.
|
|
||||||
2026-06-27T12:42:30.0366912Z Preparing to unpack .../16-libasound2-data_1.2.11-1ubuntu0.2_all.deb ...
|
|
||||||
2026-06-27T12:42:30.0413457Z Unpacking libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:42:30.1076650Z Selecting previously unselected package libasound2t64:amd64.
|
|
||||||
2026-06-27T12:42:30.1100026Z Preparing to unpack .../17-libasound2t64_1.2.11-1ubuntu0.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.1156848Z Unpacking libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:42:30.1732866Z Selecting previously unselected package libatk1.0-0t64:amd64.
|
|
||||||
2026-06-27T12:42:30.1806585Z Preparing to unpack .../18-libatk1.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.1907212Z Unpacking libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:30.2576927Z Selecting previously unselected package libxi6:amd64.
|
|
||||||
2026-06-27T12:42:30.2599670Z Preparing to unpack .../19-libxi6_2%3a1.8.1-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.2676831Z Unpacking libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:42:30.3196954Z Selecting previously unselected package libatspi2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:42:30.3319940Z Preparing to unpack .../20-libatspi2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.3369133Z Unpacking libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:30.3929712Z Selecting previously unselected package libatk-bridge2.0-0t64:amd64.
|
|
||||||
2026-06-27T12:42:30.4064142Z Preparing to unpack .../21-libatk-bridge2.0-0t64_2.52.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.4146783Z Unpacking libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:30.4636950Z Selecting previously unselected package libavahi-common-data:amd64.
|
|
||||||
2026-06-27T12:42:30.4640619Z Preparing to unpack .../22-libavahi-common-data_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.4757555Z Unpacking libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:30.5328702Z Selecting previously unselected package libavahi-common3:amd64.
|
|
||||||
2026-06-27T12:42:30.5345440Z Preparing to unpack .../23-libavahi-common3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.5402967Z Unpacking libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:30.6118371Z Selecting previously unselected package libavahi-client3:amd64.
|
|
||||||
2026-06-27T12:42:30.6132671Z Preparing to unpack .../24-libavahi-client3_0.8-13ubuntu6.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.6203926Z Unpacking libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:30.6818606Z Selecting previously unselected package libcups2t64:amd64.
|
|
||||||
2026-06-27T12:42:30.6839034Z Preparing to unpack .../25-libcups2t64_2.4.7-1.2ubuntu7.14_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.6894215Z Unpacking libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:42:30.7543613Z Selecting previously unselected package libdrm-amdgpu1:amd64.
|
|
||||||
2026-06-27T12:42:30.7546740Z Preparing to unpack .../26-libdrm-amdgpu1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.7614065Z Unpacking libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:30.8368776Z Selecting previously unselected package libpciaccess0:amd64.
|
|
||||||
2026-06-27T12:42:30.8385177Z Preparing to unpack .../27-libpciaccess0_0.17-3ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.8438172Z Unpacking libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:30.8979017Z Selecting previously unselected package libdrm-intel1:amd64.
|
|
||||||
2026-06-27T12:42:30.9018222Z Preparing to unpack .../28-libdrm-intel1_2.4.125-1ubuntu0.1~24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.9087993Z Unpacking libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:30.9848000Z Selecting previously unselected package libfontenc1:amd64.
|
|
||||||
2026-06-27T12:42:30.9881893Z Preparing to unpack .../29-libfontenc1_1%3a1.1.8-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:30.9928656Z Unpacking libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:42:31.0618525Z Selecting previously unselected package libllvm20:amd64.
|
|
||||||
2026-06-27T12:42:31.0657798Z Preparing to unpack .../30-libllvm20_1%3a20.1.2-0ubuntu1~24.04.3_amd64.deb ...
|
|
||||||
2026-06-27T12:42:31.0748654Z Unpacking libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:42:31.9407961Z Selecting previously unselected package libx11-xcb1:amd64.
|
|
||||||
2026-06-27T12:42:31.9428633Z Preparing to unpack .../31-libx11-xcb1_2%3a1.8.7-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:31.9481430Z Unpacking libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:42:32.0124848Z Selecting previously unselected package libxcb-dri3-0:amd64.
|
|
||||||
2026-06-27T12:42:32.0167818Z Preparing to unpack .../32-libxcb-dri3-0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.0224927Z Unpacking libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:32.1002094Z Selecting previously unselected package libxcb-present0:amd64.
|
|
||||||
2026-06-27T12:42:32.1006792Z Preparing to unpack .../33-libxcb-present0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.1059302Z Unpacking libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:32.1657465Z Selecting previously unselected package libxcb-randr0:amd64.
|
|
||||||
2026-06-27T12:42:32.1741067Z Preparing to unpack .../34-libxcb-randr0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.1795263Z Unpacking libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:32.2424144Z Selecting previously unselected package libxcb-sync1:amd64.
|
|
||||||
2026-06-27T12:42:32.2537994Z Preparing to unpack .../35-libxcb-sync1_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.2585549Z Unpacking libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:32.3444651Z Selecting previously unselected package libxcb-xfixes0:amd64.
|
|
||||||
2026-06-27T12:42:32.3475143Z Preparing to unpack .../36-libxcb-xfixes0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.3548307Z Unpacking libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:32.4118123Z Selecting previously unselected package libxshmfence1:amd64.
|
|
||||||
2026-06-27T12:42:32.4158253Z Preparing to unpack .../37-libxshmfence1_1.3-1build5_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.4207942Z Unpacking libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:42:32.4759063Z Selecting previously unselected package mesa-libgallium:amd64.
|
|
||||||
2026-06-27T12:42:32.4817665Z Preparing to unpack .../38-mesa-libgallium_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.4866043Z Unpacking mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:32.7788108Z Selecting previously unselected package libgbm1:amd64.
|
|
||||||
2026-06-27T12:42:32.7804249Z Preparing to unpack .../39-libgbm1_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.7858343Z Unpacking libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:32.8238390Z Selecting previously unselected package libvulkan1:amd64.
|
|
||||||
2026-06-27T12:42:32.8269746Z Preparing to unpack .../40-libvulkan1_1.3.275.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.8324163Z Unpacking libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:42:32.8941375Z Selecting previously unselected package libgl1-mesa-dri:amd64.
|
|
||||||
2026-06-27T12:42:32.9029043Z Preparing to unpack .../41-libgl1-mesa-dri_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:32.9289678Z Unpacking libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:33.0142624Z Selecting previously unselected package libxcb-glx0:amd64.
|
|
||||||
2026-06-27T12:42:33.0188872Z Preparing to unpack .../42-libxcb-glx0_1.15-1ubuntu2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.0265177Z Unpacking libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:33.0683451Z Selecting previously unselected package libxxf86vm1:amd64.
|
|
||||||
2026-06-27T12:42:33.0711811Z Preparing to unpack .../43-libxxf86vm1_1%3a1.1.4-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.0748267Z Unpacking libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:42:33.1179810Z Selecting previously unselected package libglx-mesa0:amd64.
|
|
||||||
2026-06-27T12:42:33.1201723Z Preparing to unpack .../44-libglx-mesa0_25.2.8-0ubuntu0.24.04.2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.1288120Z Unpacking libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:33.2047411Z Selecting previously unselected package libnspr4:amd64.
|
|
||||||
2026-06-27T12:42:33.2270507Z Preparing to unpack .../45-libnspr4_2%3a4.35-1.1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.2326839Z Unpacking libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:42:33.3667232Z Selecting previously unselected package libnss3:amd64.
|
|
||||||
2026-06-27T12:42:33.3744324Z Preparing to unpack .../46-libnss3_2%3a3.98-1ubuntu0.1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.3818801Z Unpacking libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:42:33.5595802Z Selecting previously unselected package libxmu6:amd64.
|
|
||||||
2026-06-27T12:42:33.5600823Z Preparing to unpack .../47-libxmu6_2%3a1.1.3-3build2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.5659236Z Unpacking libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:42:33.6225693Z Selecting previously unselected package libxpm4:amd64.
|
|
||||||
2026-06-27T12:42:33.6268435Z Preparing to unpack .../48-libxpm4_1%3a3.5.17-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.6295398Z Unpacking libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:42:33.6778049Z Selecting previously unselected package libxaw7:amd64.
|
|
||||||
2026-06-27T12:42:33.6913535Z Preparing to unpack .../49-libxaw7_2%3a1.0.14-1build2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.6988187Z Unpacking libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:42:33.7677693Z Selecting previously unselected package libxcomposite1:amd64.
|
|
||||||
2026-06-27T12:42:33.8471644Z Preparing to unpack .../50-libxcomposite1_1%3a0.4.5-1build3_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.8518746Z Unpacking libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:42:33.9068983Z Selecting previously unselected package libxdamage1:amd64.
|
|
||||||
2026-06-27T12:42:33.9088700Z Preparing to unpack .../51-libxdamage1_1%3a1.1.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.9118470Z Unpacking libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:42:33.9647636Z Selecting previously unselected package libxfixes3:amd64.
|
|
||||||
2026-06-27T12:42:33.9667975Z Preparing to unpack .../52-libxfixes3_1%3a6.0.0-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:33.9768095Z Unpacking libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:42:34.0340421Z Selecting previously unselected package libxfont2:amd64.
|
|
||||||
2026-06-27T12:42:34.0368012Z Preparing to unpack .../53-libxfont2_1%3a2.0.6-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.0418595Z Unpacking libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:42:34.1118221Z Selecting previously unselected package libxkbfile1:amd64.
|
|
||||||
2026-06-27T12:42:34.1158593Z Preparing to unpack .../54-libxkbfile1_1%3a1.1.0-1build4_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.1217883Z Unpacking libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:42:34.1868078Z Selecting previously unselected package libxrandr2:amd64.
|
|
||||||
2026-06-27T12:42:34.1917752Z Preparing to unpack .../55-libxrandr2_2%3a1.5.2-2build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.1998183Z Unpacking libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:42:34.2688187Z Selecting previously unselected package x11-xkb-utils.
|
|
||||||
2026-06-27T12:42:34.2748624Z Preparing to unpack .../56-x11-xkb-utils_7.7+8build2_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.2817820Z Unpacking x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:42:34.3428173Z Selecting previously unselected package xfonts-encodings.
|
|
||||||
2026-06-27T12:42:34.3448995Z Preparing to unpack .../57-xfonts-encodings_1%3a1.0.5-0ubuntu2_all.deb ...
|
|
||||||
2026-06-27T12:42:34.3506636Z Unpacking xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:42:34.3972741Z Selecting previously unselected package xfonts-utils.
|
|
||||||
2026-06-27T12:42:34.3973520Z Preparing to unpack .../58-xfonts-utils_1%3a7.7+6build3_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.4022644Z Unpacking xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:42:34.4524903Z Selecting previously unselected package xfonts-cyrillic.
|
|
||||||
2026-06-27T12:42:34.4525515Z Preparing to unpack .../59-xfonts-cyrillic_1%3a1.0.5+nmu1_all.deb ...
|
|
||||||
2026-06-27T12:42:34.4579039Z Unpacking xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:42:34.5111163Z Selecting previously unselected package xfonts-scalable.
|
|
||||||
2026-06-27T12:42:34.5111839Z Preparing to unpack .../60-xfonts-scalable_1%3a1.0.3-1.3_all.deb ...
|
|
||||||
2026-06-27T12:42:34.5148689Z Unpacking xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:42:34.5958290Z Selecting previously unselected package xserver-common.
|
|
||||||
2026-06-27T12:42:34.6007983Z Preparing to unpack .../61-xserver-common_2%3a21.1.12-1ubuntu1.6_all.deb ...
|
|
||||||
2026-06-27T12:42:34.6176652Z Unpacking xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:42:34.7108133Z Selecting previously unselected package libglvnd0:amd64.
|
|
||||||
2026-06-27T12:42:34.7134211Z Preparing to unpack .../62-libglvnd0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.7190171Z Unpacking libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:34.8060881Z Selecting previously unselected package libglx0:amd64.
|
|
||||||
2026-06-27T12:42:34.8077235Z Preparing to unpack .../63-libglx0_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.8159862Z Unpacking libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:34.8747543Z Selecting previously unselected package libgl1:amd64.
|
|
||||||
2026-06-27T12:42:34.8797267Z Preparing to unpack .../64-libgl1_1.7.0-1build1_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.8974063Z Unpacking libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:34.9858440Z Selecting previously unselected package xvfb.
|
|
||||||
2026-06-27T12:42:34.9883642Z Preparing to unpack .../65-xvfb_2%3a21.1.12-1ubuntu1.6_amd64.deb ...
|
|
||||||
2026-06-27T12:42:34.9985642Z Unpacking xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:42:35.1588528Z Setting up libxcb-dri3-0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.1589172Z Setting up libx11-xcb1:amd64 (2:1.8.7-1build1) ...
|
|
||||||
2026-06-27T12:42:35.1589649Z Setting up libpciaccess0:amd64 (0.17-3ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:35.1692511Z Setting up libxmu6:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:42:35.1958988Z Setting up libxdamage1:amd64 (1:1.1.6-1build1) ...
|
|
||||||
2026-06-27T12:42:35.2079330Z Setting up libxcb-xfixes0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.2202596Z Setting up libxpm4:amd64 (1:3.5.17-1build2) ...
|
|
||||||
2026-06-27T12:42:35.2337323Z Setting up libxi6:amd64 (2:1.8.1-1build1) ...
|
|
||||||
2026-06-27T12:42:35.2428819Z Setting up fonts-noto-color-emoji (2.047-0ubuntu0.24.04.1) ...
|
|
||||||
2026-06-27T12:42:35.2831781Z Setting up libglvnd0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.2941931Z Setting up libxcb-glx0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.3148327Z Setting up libsensors-config (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:42:35.3340874Z Setting up fonts-wqy-zenhei (0.9.45-8) ...
|
|
||||||
2026-06-27T12:42:35.3736402Z Setting up fonts-freefont-ttf (20211204+svn4273-2) ...
|
|
||||||
2026-06-27T12:42:35.4196321Z Setting up xkb-data (2.41-2ubuntu1.1) ...
|
|
||||||
2026-06-27T12:42:35.4301010Z Setting up libxaw7:amd64 (2:1.0.14-1build2) ...
|
|
||||||
2026-06-27T12:42:35.4371512Z Setting up libxxf86vm1:amd64 (1:1.1.4-1build4) ...
|
|
||||||
2026-06-27T12:42:35.4470403Z Setting up libxcb-present0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.4599620Z Setting up libasound2-data (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:42:35.4672816Z Setting up libfontenc1:amd64 (1:1.1.8-1build1) ...
|
|
||||||
2026-06-27T12:42:35.4751887Z Setting up libasound2t64:amd64 (1.2.11-1ubuntu0.2) ...
|
|
||||||
2026-06-27T12:42:35.4839264Z Setting up fonts-tlwg-loma-otf (1:0.7.3-1) ...
|
|
||||||
2026-06-27T12:42:35.4905170Z Setting up libnspr4:amd64 (2:4.35-1.1build1) ...
|
|
||||||
2026-06-27T12:42:35.4979521Z Setting up libxfixes3:amd64 (1:6.0.0-2build1) ...
|
|
||||||
2026-06-27T12:42:35.5080443Z Setting up libxcb-sync1:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.5211610Z Setting up libavahi-common-data:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:35.5372464Z Setting up libatspi2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.5591662Z Setting up xfonts-encodings (1:1.0.5-0ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.5750647Z Setting up libxrandr2:amd64 (2:1.5.2-2build1) ...
|
|
||||||
2026-06-27T12:42:35.6034664Z Setting up libllvm20:amd64 (1:20.1.2-0ubuntu1~24.04.3) ...
|
|
||||||
2026-06-27T12:42:35.6301672Z Setting up libsensors5:amd64 (1:3.6.0-9build1) ...
|
|
||||||
2026-06-27T12:42:35.6447069Z Setting up libvulkan1:amd64 (1.3.275.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.6655707Z Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
|
|
||||||
2026-06-27T12:42:35.6907479Z update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
|
|
||||||
2026-06-27T12:42:35.6989085Z Setting up libxshmfence1:amd64 (1.3-1build5) ...
|
|
||||||
2026-06-27T12:42:35.7119704Z Setting up at-spi2-common (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.7217793Z Setting up libxcb-randr0:amd64 (1.15-1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:35.7369852Z Setting up fonts-liberation (1:2.1.5-3) ...
|
|
||||||
2026-06-27T12:42:35.7480495Z Setting up libxkbfile1:amd64 (1:1.1.0-1build4) ...
|
|
||||||
2026-06-27T12:42:35.7539430Z Setting up libdrm-common (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:35.7628279Z Setting up libxcomposite1:amd64 (1:0.4.5-1build3) ...
|
|
||||||
2026-06-27T12:42:35.7742121Z Setting up libxfont2:amd64 (1:2.0.6-1build1) ...
|
|
||||||
2026-06-27T12:42:35.7852365Z Setting up libxmuu1:amd64 (2:1.1.3-3build2) ...
|
|
||||||
2026-06-27T12:42:35.7951874Z Setting up fonts-unifont (1:15.1.01-1build1) ...
|
|
||||||
2026-06-27T12:42:35.8058196Z Setting up libxkbcommon0:amd64 (1.6.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.8147865Z Setting up libatk1.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:35.8247475Z Setting up x11-xkb-utils (7.7+8build2) ...
|
|
||||||
2026-06-27T12:42:35.8328368Z Setting up libavahi-common3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:35.8419054Z Setting up libnss3:amd64 (2:3.98-1ubuntu0.1) ...
|
|
||||||
2026-06-27T12:42:35.8494855Z Setting up xfonts-utils (1:7.7+6build3) ...
|
|
||||||
2026-06-27T12:42:35.8638363Z Setting up libdrm2:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:35.8717765Z Setting up xauth (1:1.1.2-1build1) ...
|
|
||||||
2026-06-27T12:42:35.8802130Z Setting up xfonts-cyrillic (1:1.0.5+nmu1) ...
|
|
||||||
2026-06-27T12:42:35.9718793Z Setting up xserver-common (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:42:35.9830883Z Setting up libavahi-client3:amd64 (0.8-13ubuntu6.2) ...
|
|
||||||
2026-06-27T12:42:35.9951003Z Setting up xfonts-scalable (1:1.0.3-1.3) ...
|
|
||||||
2026-06-27T12:42:36.1068294Z Setting up libdrm-amdgpu1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.1212524Z Setting up libatk-bridge2.0-0t64:amd64 (2.52.0-1build1) ...
|
|
||||||
2026-06-27T12:42:36.1320412Z Setting up libdrm-intel1:amd64 (2.4.125-1ubuntu0.1~24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.1442210Z Setting up libcups2t64:amd64 (2.4.7-1.2ubuntu7.14) ...
|
|
||||||
2026-06-27T12:42:36.1516259Z Setting up mesa-libgallium:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.1630424Z Setting up libgbm1:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.1752358Z Setting up libgl1-mesa-dri:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.1909451Z Setting up libglx-mesa0:amd64 (25.2.8-0ubuntu0.24.04.2) ...
|
|
||||||
2026-06-27T12:42:36.2058632Z Setting up libglx0:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:36.2159218Z Setting up libgl1:amd64 (1.7.0-1build1) ...
|
|
||||||
2026-06-27T12:42:36.2299122Z Setting up xvfb (2:21.1.12-1ubuntu1.6) ...
|
|
||||||
2026-06-27T12:42:36.2439140Z Processing triggers for fontconfig (2.15.0-1.1ubuntu2) ...
|
|
||||||
2026-06-27T12:42:36.4498709Z Processing triggers for libc-bin (2.39-0ubuntu8.7) ...
|
|
||||||
2026-06-27T12:42:36.9655653Z ::group::Run set -e
|
|
||||||
2026-06-27T12:42:36.9656011Z set -e
|
|
||||||
2026-06-27T12:42:36.9656284Z EXPECTED_VERSION="$(git rev-parse --short HEAD)"
|
|
||||||
2026-06-27T12:42:36.9656391Z for i in $(seq 1 60); do
|
|
||||||
2026-06-27T12:42:36.9656478Z VERSION_BODY="$(curl -fsS "http://${DEPLOY_HOST}/taxbaik/version.txt" || true)"
|
|
||||||
2026-06-27T12:42:36.9656576Z BLOG_STATUS="$(curl -s -o /dev/null -w '%{http_code}' "http://${DEPLOY_HOST}/taxbaik/blog/accountant-mistakes-5" || true)"
|
|
||||||
2026-06-27T12:42:36.9656681Z if echo "$VERSION_BODY" | grep -q "Version: ${EXPECTED_VERSION}" && [ "$BLOG_STATUS" = "200" ]; then
|
|
||||||
2026-06-27T12:42:36.9656780Z echo "Deployment is ready for ${EXPECTED_VERSION}"
|
|
||||||
2026-06-27T12:42:36.9656860Z exit 0
|
|
||||||
2026-06-27T12:42:36.9656934Z fi
|
|
||||||
2026-06-27T12:42:36.9657013Z echo "Waiting for deployment ${EXPECTED_VERSION}; blog status=${BLOG_STATUS}; version=${VERSION_BODY}"
|
|
||||||
2026-06-27T12:42:36.9657148Z sleep 10
|
|
||||||
2026-06-27T12:42:36.9657225Z done
|
|
||||||
2026-06-27T12:42:36.9657290Z echo "Deployment did not publish expected version ${EXPECTED_VERSION} in time" >&2
|
|
||||||
2026-06-27T12:42:36.9657373Z exit 1
|
|
||||||
2026-06-27T12:42:36.9657448Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:42:36.9657553Z env:
|
|
||||||
2026-06-27T12:42:36.9657624Z DEPLOY_HOST: ***
|
|
||||||
2026-06-27T12:42:36.9657841Z ::endgroup::
|
|
||||||
2026-06-27T12:42:37.1270652Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:42:37.1393546Z Waiting for deployment 0c49e12; blog status=502; version=
|
|
||||||
2026-06-27T12:42:47.1480594Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:42:47.1587988Z Waiting for deployment 0c49e12; blog status=502; version=
|
|
||||||
2026-06-27T12:42:57.1786862Z curl: (22) The requested URL returned error: 502
|
|
||||||
2026-06-27T12:42:57.2057517Z Waiting for deployment 0c49e12; blog status=502; version=
|
|
||||||
2026-06-27T12:43:07.3227793Z Deployment is ready for 0c49e12
|
|
||||||
2026-06-27T12:43:07.4327814Z ::group::Run npm run test:e2e
|
|
||||||
2026-06-27T12:43:07.4328144Z npm run test:e2e
|
|
||||||
2026-06-27T12:43:07.4328257Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:43:07.4328377Z env:
|
|
||||||
2026-06-27T12:43:07.4328501Z E2E_BASE_URL: http://***/taxbaik
|
|
||||||
2026-06-27T12:43:07.4328672Z E2E_ADMIN_USERNAME: admin
|
|
||||||
2026-06-27T12:43:07.4328817Z E2E_ADMIN_PASSWORD: ***
|
|
||||||
2026-06-27T12:43:07.4328908Z ::endgroup::
|
|
||||||
2026-06-27T12:43:07.6807574Z
|
|
||||||
2026-06-27T12:43:07.6808279Z > test:e2e
|
|
||||||
2026-06-27T12:43:07.6808406Z > playwright test
|
|
||||||
2026-06-27T12:43:07.6808493Z
|
|
||||||
2026-06-27T12:43:09.8499533Z
|
|
||||||
2026-06-27T12:43:09.8500502Z Running 8 tests using 1 worker
|
|
||||||
2026-06-27T12:43:09.8502145Z
|
|
||||||
2026-06-27T12:43:13.9066399Z ✓ 1 [chromium] › tests/e2e/admin-login.spec.ts:8:7 › admin authentication › logs in through the real browser UI and reaches dashboard (2.5s)
|
|
||||||
2026-06-27T12:43:14.2273264Z - 2 [chromium] › tests/e2e/admin-password-change.spec.ts:10:7 › admin password change › changes password through the real admin UI
|
|
||||||
2026-06-27T12:43:16.4655020Z ✓ 3 [chromium] › tests/e2e/admin-smoke.spec.ts:9:7 › admin smoke › navigates the main admin menus without circuit errors (2.2s)
|
|
||||||
2026-06-27T12:43:17.7178256Z ✓ 4 [chromium] › tests/e2e/blog-seo.spec.ts:6:7 › blog seo › exposes title description and canonical on blog detail pages (1.2s)
|
|
||||||
2026-06-27T12:43:17.7946524Z ✓ 5 [chromium] › tests/e2e/contact-submit.spec.ts:9:7 › contact submit › creates an inquiry through the public API (56ms)
|
|
||||||
2026-06-27T12:43:19.6302888Z ✓ 6 [chromium] › tests/e2e/contact-submit.spec.ts:26:7 › contact submit › creates an inquiry and shows it in admin list (1.8s)
|
|
||||||
2026-06-27T12:43:21.5037753Z ✘ 7 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (1.7s)
|
|
||||||
2026-06-27T12:43:24.4570513Z ✘ 8 [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links (retry #1) (1.7s)
|
|
||||||
2026-06-27T12:43:27.0178380Z ✓ 9 [chromium] › tests/e2e/public-smoke.spec.ts:6:7 › public smoke › loads the main public pages with SEO basics (1.6s)
|
|
||||||
2026-06-27T12:43:27.0734184Z
|
|
||||||
2026-06-27T12:43:27.0739702Z
|
|
||||||
2026-06-27T12:43:27.0754918Z 1) [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:43:27.0755219Z
|
|
||||||
2026-06-27T12:43:27.0755634Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:43:27.0755784Z
|
|
||||||
2026-06-27T12:43:27.0755953Z Locator: getByText('010-9876-5432')
|
|
||||||
2026-06-27T12:43:27.0756397Z Expected: visible
|
|
||||||
2026-06-27T12:43:27.0756564Z Error: strict mode violation: getByText('010-9876-5432') resolved to 2 elements:
|
|
||||||
2026-06-27T12:43:27.0756702Z 1) <td>010-9876-5432</td> aka getByRole('cell', { name: '-9876-5432' }).first()
|
|
||||||
2026-06-27T12:43:27.0756805Z 2) <td>010-9876-5432</td> aka getByRole('cell', { name: '-9876-5432' }).nth(1)
|
|
||||||
2026-06-27T12:43:27.0756898Z
|
|
||||||
2026-06-27T12:43:27.0757160Z Call log:
|
|
||||||
2026-06-27T12:43:27.0757294Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:43:27.0757388Z [2m - waiting for getByText('010-9876-5432')[22m
|
|
||||||
2026-06-27T12:43:27.0757471Z
|
|
||||||
2026-06-27T12:43:27.0757579Z
|
|
||||||
2026-06-27T12:43:27.0757653Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:43:27.0757761Z 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0758016Z > 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0758137Z | ^
|
|
||||||
2026-06-27T12:43:27.0758222Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0758362Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0758486Z 42 | await expect(page.getByRole('button', { name: '연락함' })).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0758736Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:39:41
|
|
||||||
2026-06-27T12:43:27.0758856Z
|
|
||||||
2026-06-27T12:43:27.0758956Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0759123Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/test-failed-1.png
|
|
||||||
2026-06-27T12:43:27.0759230Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0759366Z
|
|
||||||
2026-06-27T12:43:27.0759613Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0759745Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/video.webm
|
|
||||||
2026-06-27T12:43:27.0759877Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0760025Z
|
|
||||||
2026-06-27T12:43:27.0760147Z Error Context: test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/error-context.md
|
|
||||||
2026-06-27T12:43:27.0760419Z
|
|
||||||
2026-06-27T12:43:27.0760567Z attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0760724Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:43:27.0760842Z Usage:
|
|
||||||
2026-06-27T12:43:27.0760926Z
|
|
||||||
2026-06-27T12:43:27.0761014Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium/trace.zip
|
|
||||||
2026-06-27T12:43:27.0761278Z
|
|
||||||
2026-06-27T12:43:27.0761371Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0761541Z
|
|
||||||
2026-06-27T12:43:27.0761726Z Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0761855Z
|
|
||||||
2026-06-27T12:43:27.0761950Z Error: [2mexpect([22m[31mlocator[39m[2m).[22mtoBeVisible[2m([22m[2m)[22m failed
|
|
||||||
2026-06-27T12:43:27.0762048Z
|
|
||||||
2026-06-27T12:43:27.0762210Z Locator: getByText('Detail-1782564202674')
|
|
||||||
2026-06-27T12:43:27.0762376Z Expected: visible
|
|
||||||
2026-06-27T12:43:27.0763861Z Error: strict mode violation: getByText('Detail-1782564202674') resolved to 2 elements:
|
|
||||||
2026-06-27T12:43:27.0764174Z 1) <p class="mud-typography mud-typography-body1">Detail-1782564202674</p> aka getByText('Detail-1782564202674', { exact: true })
|
|
||||||
2026-06-27T12:43:27.0764386Z 2) <p class="mud-typography mud-typography-body1">detail-1782564202674@example.com</p> aka getByText('detail-1782564202674@example.')
|
|
||||||
2026-06-27T12:43:27.0764707Z
|
|
||||||
2026-06-27T12:43:27.0764932Z Call log:
|
|
||||||
2026-06-27T12:43:27.0765090Z [2m - Expect "toBeVisible" with timeout 10000ms[22m
|
|
||||||
2026-06-27T12:43:27.0765268Z [2m - waiting for getByText('Detail-1782564202674')[22m
|
|
||||||
2026-06-27T12:43:27.0765404Z
|
|
||||||
2026-06-27T12:43:27.0765477Z
|
|
||||||
2026-06-27T12:43:27.0765561Z 36 |
|
|
||||||
2026-06-27T12:43:27.0765640Z 37 | await expect(page).toHaveURL(/\/taxbaik\/admin\/inquiries\/\d+$/);
|
|
||||||
2026-06-27T12:43:27.0765780Z > 38 | await expect(page.getByText(name)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0765937Z | ^
|
|
||||||
2026-06-27T12:43:27.0766015Z 39 | await expect(page.getByText(phone)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0766304Z 40 | await expect(page.getByText(message)).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0766387Z 41 | await expect(page.getByRole('button', { name: '신규' })).toBeVisible();
|
|
||||||
2026-06-27T12:43:27.0766490Z at /workspace/***/taxbaik/tests/e2e/inquiry-detail.spec.ts:38:40
|
|
||||||
2026-06-27T12:43:27.0766594Z
|
|
||||||
2026-06-27T12:43:27.0766702Z attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0766841Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/test-failed-1.png
|
|
||||||
2026-06-27T12:43:27.0767062Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0767201Z
|
|
||||||
2026-06-27T12:43:27.0767273Z attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0767413Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/video.webm
|
|
||||||
2026-06-27T12:43:27.0767512Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0767633Z
|
|
||||||
2026-06-27T12:43:27.0767700Z Error Context: test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/error-context.md
|
|
||||||
2026-06-27T12:43:27.0767860Z
|
|
||||||
2026-06-27T12:43:27.0767950Z attachment #4: trace (application/zip) ─────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0768068Z test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:43:27.0768191Z Usage:
|
|
||||||
2026-06-27T12:43:27.0768261Z
|
|
||||||
2026-06-27T12:43:27.0768346Z npx playwright show-trace test-results/inquiry-detail-inquiry-det-43d69-uiry-and-admin-action-links-chromium-retry1/trace.zip
|
|
||||||
2026-06-27T12:43:27.0768434Z
|
|
||||||
2026-06-27T12:43:27.0768497Z ────────────────────────────────────────────────────────────────────────────────────────────────
|
|
||||||
2026-06-27T12:43:27.0768627Z
|
|
||||||
2026-06-27T12:43:27.0768821Z 1 failed
|
|
||||||
2026-06-27T12:43:27.0768915Z [chromium] › tests/e2e/inquiry-detail.spec.ts:9:7 › inquiry detail › shows the created inquiry and admin action links
|
|
||||||
2026-06-27T12:43:27.0769028Z 1 skipped
|
|
||||||
2026-06-27T12:43:27.0769138Z 6 passed (17.7s)
|
|
||||||
2026-06-27T12:43:27.1452880Z ❌ Failure - Main Browser E2E verification
|
|
||||||
2026-06-27T12:43:27.1577590Z exitcode '1': failure
|
|
||||||
2026-06-27T12:43:27.2549906Z ::group::Run echo "Executed tests:"
|
|
||||||
2026-06-27T12:43:27.2550319Z echo "Executed tests:"
|
|
||||||
2026-06-27T12:43:27.2550467Z echo "- admin-login"
|
|
||||||
2026-06-27T12:43:27.2550592Z echo "- admin-smoke"
|
|
||||||
2026-06-27T12:43:27.2550734Z echo "- public-smoke"
|
|
||||||
2026-06-27T12:43:27.2550826Z echo "- blog-seo"
|
|
||||||
2026-06-27T12:43:27.2550902Z echo "- contact-submit"
|
|
||||||
2026-06-27T12:43:27.2550974Z echo "- inquiry-detail"
|
|
||||||
2026-06-27T12:43:27.2551043Z echo "- admin-password-change"
|
|
||||||
2026-06-27T12:43:27.2551125Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T12:43:27.2551220Z ::endgroup::
|
|
||||||
2026-06-27T12:43:27.3085319Z Executed tests:
|
|
||||||
2026-06-27T12:43:27.3086315Z - admin-login
|
|
||||||
2026-06-27T12:43:27.3086474Z - admin-smoke
|
|
||||||
2026-06-27T12:43:27.3086563Z - public-smoke
|
|
||||||
2026-06-27T12:43:27.3086658Z - blog-seo
|
|
||||||
2026-06-27T12:43:27.3086752Z - contact-submit
|
|
||||||
2026-06-27T12:43:27.3086871Z - inquiry-detail
|
|
||||||
2026-06-27T12:43:27.3087016Z - admin-password-change
|
|
||||||
2026-06-27T12:43:27.3553533Z expression '${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}' rewritten to 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:43:27.3554082Z evaluating expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))'
|
|
||||||
2026-06-27T12:43:27.3554852Z Writing entry to tarball workflow/hashfiles/index.js len:168437
|
|
||||||
2026-06-27T12:43:27.3557556Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:43:27.3590761Z 🐳 docker exec cmd=[node /var/run/act/workflow/hashfiles/index.js] user= workdir=
|
|
||||||
2026-06-27T12:43:27.3591172Z Exec command '[node /var/run/act/workflow/hashfiles/index.js]'
|
|
||||||
2026-06-27T12:43:27.3591485Z Working directory '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T12:43:27.4880849Z expression 'format('{0}-playwright-{1}', runner.os, hashFiles('package-lock.json'))' evaluated to '%!t(string=Linux-playwright-da5b0f170046fc2084d2c68f83e739454760e58eda8b88046a83cc8256c7af8f)'
|
|
||||||
2026-06-27T12:43:27.4883858Z expression '${{ runner.os }}-playwright-\n' rewritten to 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:43:27.4884154Z evaluating expression 'format('{0}-playwright-\n', runner.os)'
|
|
||||||
2026-06-27T12:43:27.4884741Z expression 'format('{0}-playwright-\n', runner.os)' evaluated to '%!t(string=Linux-playwright-\n)'
|
|
||||||
2026-06-27T12:43:27.4967884Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:43:27.4968244Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:43:27.4968392Z Skipping step 'Cache Playwright browsers' due to 'success()'
|
|
||||||
2026-06-27T12:43:27.5176744Z evaluating expression 'success()'
|
|
||||||
2026-06-27T12:43:27.5177209Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T12:43:27.5177349Z Skipping step 'Setup Node.js' due to 'success()'
|
|
||||||
2026-06-27T12:43:27.5358315Z evaluating expression 'always()'
|
|
||||||
2026-06-27T12:43:27.5358814Z expression 'always()' evaluated to 'true'
|
|
||||||
2026-06-27T12:43:27.5358938Z ⭐ Run Post Checkout code
|
|
||||||
2026-06-27T12:43:27.5359109Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T12:43:27.5359252Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T12:43:27.5359353Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T12:43:27.5359452Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T12:43:27.5359549Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T12:43:27.5359830Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T12:43:27.5381941Z run post step for 'Checkout code'
|
|
||||||
2026-06-27T12:43:27.5382805Z executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]
|
|
||||||
2026-06-27T12:43:27.5854104Z 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir=
|
|
||||||
2026-06-27T12:43:27.5854588Z Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]'
|
|
||||||
2026-06-27T12:43:27.5855192Z Working directory '/workspace/***/taxbaik'
|
|
||||||
-284
@@ -1,284 +0,0 @@
|
|||||||
2026-06-27T13:12:18.8138426Z hz-prod-runner-2(version:v0.6.1) received task 277 of job build-and-deploy, be triggered by event: push
|
|
||||||
2026-06-27T13:12:18.8143142Z workflow prepared
|
|
||||||
2026-06-27T13:12:18.8143844Z evaluating expression 'success()'
|
|
||||||
2026-06-27T13:12:18.8144614Z expression 'success()' evaluated to 'true'
|
|
||||||
2026-06-27T13:12:18.8144777Z 🚀 Start image=docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T13:12:18.8274089Z 🐳 docker pull image=docker.gitea.com/runner-images:ubuntu-latest platform= username= forcePull=false
|
|
||||||
2026-06-27T13:12:18.8274359Z 🐳 docker pull docker.gitea.com/runner-images:ubuntu-latest
|
|
||||||
2026-06-27T13:12:18.8603139Z Image exists? true
|
|
||||||
2026-06-27T13:12:18.9193930Z 🐳 docker create image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T13:12:19.0382950Z Created container name=GITEA-ACTIONS-TASK-277-WORKFLOW-TaxBaik-CI-CD-JOB-build-and-dep-81358f67ff8537411403244208e6df1e8824d7fa599c29be44b8edde7bee1d0e id=d6313082a96795f171407814e9b27ea01af230c6493a2a782893b4c72c5a2ab3 from image docker.gitea.com/runner-images:ubuntu-latest (platform: )
|
|
||||||
2026-06-27T13:12:19.0383521Z ENV ==> [RUNNER_TOOL_CACHE=/opt/hostedtoolcache RUNNER_OS=Linux RUNNER_ARCH=X64 RUNNER_TEMP=/tmp LANG=C.UTF-8]
|
|
||||||
2026-06-27T13:12:19.0383662Z 🐳 docker run image=docker.gitea.com/runner-images:ubuntu-latest platform= entrypoint=["/bin/sleep" "10800"] cmd=[] network="gitea_default"
|
|
||||||
2026-06-27T13:12:19.0383780Z Starting container: d6313082a96795f171407814e9b27ea01af230c6493a2a782893b4c72c5a2ab3
|
|
||||||
2026-06-27T13:12:19.1846894Z Started container: d6313082a96795f171407814e9b27ea01af230c6493a2a782893b4c72c5a2ab3
|
|
||||||
2026-06-27T13:12:19.2706682Z Writing entry to tarball workflow/event.json len:4824
|
|
||||||
2026-06-27T13:12:19.2710592Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T13:12:19.2711581Z Extracting content to '/var/run/act/'
|
|
||||||
2026-06-27T13:12:19.2920884Z ☁ git clone 'https://github.com/actions/checkout' # ref=v4
|
|
||||||
2026-06-27T13:12:19.2921225Z cloning https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T13:12:19.9162579Z Unable to pull refs/heads/v4: non-fast-forward update
|
|
||||||
2026-06-27T13:12:19.9163012Z Cloned https://github.com/actions/checkout to /root/.cache/act/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab
|
|
||||||
2026-06-27T13:12:19.9271556Z Checked out v4
|
|
||||||
2026-06-27T13:12:19.9373332Z ☁ git clone 'https://github.com/actions/setup-dotnet' # ref=v4
|
|
||||||
2026-06-27T13:12:19.9373628Z cloning https://github.com/actions/setup-dotnet to /root/.cache/act/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336
|
|
||||||
2026-06-27T13:12:20.4452471Z Unable to pull refs/heads/v4: worktree contains unstaged changes
|
|
||||||
2026-06-27T13:12:20.4452909Z Cloned https://github.com/actions/setup-dotnet to /root/.cache/act/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336
|
|
||||||
2026-06-27T13:12:20.4566454Z Checked out v4
|
|
||||||
2026-06-27T13:12:20.4806890Z evaluating expression ''
|
|
||||||
2026-06-27T13:12:20.4807480Z expression '' evaluated to 'true'
|
|
||||||
2026-06-27T13:12:20.4807609Z ⭐ Run Main Checkout code
|
|
||||||
2026-06-27T13:12:20.4807800Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T13:12:20.4807954Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T13:12:20.4808060Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T13:12:20.4808178Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T13:12:20.4808282Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T13:12:20.4808380Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T13:12:20.4842929Z ::group::Run Checkout code
|
|
||||||
2026-06-27T13:12:20.9904267Z ::add-matcher::/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/problem-matcher.json
|
|
||||||
2026-06-27T13:12:20.9913104Z Syncing repository: ***/taxbaik
|
|
||||||
2026-06-27T13:12:20.9919005Z ::group::Getting Git version info
|
|
||||||
2026-06-27T13:12:20.9920414Z Working directory is '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T13:12:20.9971735Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T13:12:21.0019496Z git version 2.54.0
|
|
||||||
2026-06-27T13:12:21.0049414Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.0069520Z Temporarily overriding HOME='/tmp/a8966535-3ef4-4d35-ac60-c313924b3d76' before making global git config changes
|
|
||||||
2026-06-27T13:12:21.0071498Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T13:12:21.0075987Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T13:12:21.0117500Z Deleting the contents of '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T13:12:21.0123329Z ::group::Initializing the repository
|
|
||||||
2026-06-27T13:12:21.0130583Z [command]/usr/bin/git init /workspace/***/taxbaik
|
|
||||||
2026-06-27T13:12:21.0230446Z hint: Using 'master' as the name for the initial branch. This default branch name
|
|
||||||
2026-06-27T13:12:21.0231037Z hint: will change to "main" in Git 3.0. To configure the initial branch name
|
|
||||||
2026-06-27T13:12:21.0231198Z hint: to use in all of your new repositories, which will suppress this warning,
|
|
||||||
2026-06-27T13:12:21.0231401Z hint: call:
|
|
||||||
2026-06-27T13:12:21.0231484Z hint:
|
|
||||||
2026-06-27T13:12:21.0231608Z hint: git config --global init.defaultBranch <name>
|
|
||||||
2026-06-27T13:12:21.0231759Z hint:
|
|
||||||
2026-06-27T13:12:21.0231921Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
|
|
||||||
2026-06-27T13:12:21.0232060Z hint: 'development'. The just-created branch can be renamed via this command:
|
|
||||||
2026-06-27T13:12:21.0232186Z hint:
|
|
||||||
2026-06-27T13:12:21.0232341Z hint: git branch -m <name>
|
|
||||||
2026-06-27T13:12:21.0232468Z hint:
|
|
||||||
2026-06-27T13:12:21.0232580Z hint: Disable this message with "git config set advice.defaultBranchName false"
|
|
||||||
2026-06-27T13:12:21.0234035Z Initialized empty Git repository in /workspace/***/taxbaik/.git/
|
|
||||||
2026-06-27T13:12:21.0249566Z [command]/usr/bin/git remote add origin http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T13:12:21.0296794Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.0297773Z ::group::Disabling automatic garbage collection
|
|
||||||
2026-06-27T13:12:21.0301030Z [command]/usr/bin/git config --local gc.auto 0
|
|
||||||
2026-06-27T13:12:21.0342617Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.0343174Z ::group::Setting up auth
|
|
||||||
2026-06-27T13:12:21.0353769Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T13:12:21.0401148Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T13:12:21.0825984Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T13:12:21.0862378Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T13:12:21.1162706Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T13:12:21.1204118Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T13:12:21.1745034Z [command]/usr/bin/git config --local http.http://gitea:3000/.extraheader AUTHORIZATION: basic ***
|
|
||||||
2026-06-27T13:12:21.1810732Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.1811265Z ::group::Fetching the repository
|
|
||||||
2026-06-27T13:12:21.1822444Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +301efb32ffe2c15b9ac7021906aba153b2a470bd:refs/remotes/origin/master
|
|
||||||
2026-06-27T13:12:21.3013801Z From http://gitea:3000/***/taxbaik
|
|
||||||
2026-06-27T13:12:21.3014323Z * [new ref] 301efb32ffe2c15b9ac7021906aba153b2a470bd -> origin/master
|
|
||||||
2026-06-27T13:12:21.3054812Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.3057256Z ::group::Determining the checkout info
|
|
||||||
2026-06-27T13:12:21.3061520Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.3069281Z [command]/usr/bin/git sparse-checkout disable
|
|
||||||
2026-06-27T13:12:21.3120982Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig
|
|
||||||
2026-06-27T13:12:21.3154739Z ::group::Checking out the ref
|
|
||||||
2026-06-27T13:12:21.3163293Z [command]/usr/bin/git checkout --progress --force -B master refs/remotes/origin/master
|
|
||||||
2026-06-27T13:12:21.3306621Z Reset branch 'master'
|
|
||||||
2026-06-27T13:12:21.3313087Z branch 'master' set up to track 'origin/master'.
|
|
||||||
2026-06-27T13:12:21.3331734Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.3395903Z [command]/usr/bin/git log -1 --format=%H
|
|
||||||
2026-06-27T13:12:21.3432814Z 301efb32ffe2c15b9ac7021906aba153b2a470bd
|
|
||||||
2026-06-27T13:12:21.3460362Z ::remove-matcher owner=checkout-git::
|
|
||||||
2026-06-27T13:12:21.3579593Z ::endgroup::
|
|
||||||
2026-06-27T13:12:21.4302050Z ::group::Run Setup .NET
|
|
||||||
2026-06-27T13:12:21.4302554Z with:
|
|
||||||
2026-06-27T13:12:21.4302665Z dotnet-version: 10.0
|
|
||||||
2026-06-27T13:12:22.0459276Z (node:142) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
|
|
||||||
2026-06-27T13:12:22.0461374Z (Use `node --trace-deprecation ...` to show where the warning was created)
|
|
||||||
2026-06-27T13:12:22.0560230Z [command]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS
|
|
||||||
2026-06-27T13:12:22.3987301Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz
|
|
||||||
2026-06-27T13:12:22.6324592Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz size is 36606251 bytes.
|
|
||||||
2026-06-27T13:12:22.6408160Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.9/dotnet-runtime-10.0.9-linux-x64.tar.gz
|
|
||||||
2026-06-27T13:12:23.4950421Z dotnet-install: Downloaded file size is 36606251 bytes.
|
|
||||||
2026-06-27T13:12:23.4956878Z dotnet-install: The remote and local file sizes are equal.
|
|
||||||
2026-06-27T13:12:23.5264515Z dotnet-install: Installed version is 10.0.9
|
|
||||||
2026-06-27T13:12:23.5339988Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script.
|
|
||||||
2026-06-27T13:12:23.5348062Z dotnet-install: Note that the script does not resolve dependencies during installation.
|
|
||||||
2026-06-27T13:12:23.5348573Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
|
|
||||||
2026-06-27T13:12:23.5349103Z dotnet-install: Installation finished successfully.
|
|
||||||
2026-06-27T13:12:23.5374764Z [command]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/externals/install-dotnet.sh --skip-non-versioned-files --channel 10.0
|
|
||||||
2026-06-27T13:12:23.8387651Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz
|
|
||||||
2026-06-27T13:12:24.7117583Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz size is 235086718 bytes.
|
|
||||||
2026-06-27T13:12:24.7126373Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.301/dotnet-sdk-10.0.301-linux-x64.tar.gz
|
|
||||||
2026-06-27T13:12:32.2146389Z dotnet-install: Downloaded file size is 235086718 bytes.
|
|
||||||
2026-06-27T13:12:32.2147245Z dotnet-install: The remote and local file sizes are equal.
|
|
||||||
2026-06-27T13:12:32.4424336Z dotnet-install: Installed version is 10.0.301
|
|
||||||
2026-06-27T13:12:32.4497428Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script.
|
|
||||||
2026-06-27T13:12:32.4497919Z dotnet-install: Note that the script does not resolve dependencies during installation.
|
|
||||||
2026-06-27T13:12:32.4498054Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section.
|
|
||||||
2026-06-27T13:12:32.4498172Z dotnet-install: Installation finished successfully.
|
|
||||||
2026-06-27T13:12:32.4525881Z ##[add-matcher]/run/act/actions/2d637816dd86ec9ff59dad9ec3547bf90b88133b3029538a91ec96ac7f316336/.github/csc.json
|
|
||||||
2026-06-27T13:12:32.4621848Z ::endgroup::
|
|
||||||
2026-06-27T13:12:32.6161034Z ::group::Run dotnet restore TaxBaik.sln
|
|
||||||
2026-06-27T13:12:32.6161379Z dotnet restore TaxBaik.sln
|
|
||||||
2026-06-27T13:12:32.6161499Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T13:12:32.6161626Z ::endgroup::
|
|
||||||
2026-06-27T13:12:32.8212869Z
|
|
||||||
2026-06-27T13:12:32.8225808Z Welcome to .NET 10.0!
|
|
||||||
2026-06-27T13:12:32.8226776Z ---------------------
|
|
||||||
2026-06-27T13:12:32.8228475Z SDK Version: 10.0.301
|
|
||||||
2026-06-27T13:12:32.8230536Z
|
|
||||||
2026-06-27T13:12:32.8232570Z Telemetry
|
|
||||||
2026-06-27T13:12:32.8233082Z ---------
|
|
||||||
2026-06-27T13:12:32.8235004Z The .NET tools collect usage data in order to help us improve your experience. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
|
|
||||||
2026-06-27T13:12:32.8235543Z
|
|
||||||
2026-06-27T13:12:32.8237259Z Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
|
|
||||||
2026-06-27T13:12:33.1562163Z
|
|
||||||
2026-06-27T13:12:33.1564784Z ----------------
|
|
||||||
2026-06-27T13:12:33.1565126Z Installed an ASP.NET Core HTTPS development certificate.
|
|
||||||
2026-06-27T13:12:33.1565383Z To trust the certificate, run 'dotnet dev-certs https --trust'
|
|
||||||
2026-06-27T13:12:33.1566916Z Learn about HTTPS: https://aka.ms/dotnet-https
|
|
||||||
2026-06-27T13:12:33.1568950Z
|
|
||||||
2026-06-27T13:12:33.1570460Z ----------------
|
|
||||||
2026-06-27T13:12:33.1570607Z Write your first app: https://aka.ms/dotnet-hello-world
|
|
||||||
2026-06-27T13:12:33.1570863Z Find out what's new: https://aka.ms/dotnet-whats-new
|
|
||||||
2026-06-27T13:12:33.1570955Z Explore documentation: https://aka.ms/dotnet-docs
|
|
||||||
2026-06-27T13:12:33.1571037Z Report issues and find source on GitHub: https://github.com/dotnet/core
|
|
||||||
2026-06-27T13:12:33.1572179Z Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli
|
|
||||||
2026-06-27T13:12:33.1573517Z --------------------------------------------------------------------------------------
|
|
||||||
2026-06-27T13:12:34.5938340Z Determining projects to restore...
|
|
||||||
2026-06-27T13:12:35.6900179Z Restored /workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj (in 184 ms).
|
|
||||||
2026-06-27T13:12:37.5656901Z Restored /workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj (in 2.09 sec).
|
|
||||||
2026-06-27T13:12:38.1428024Z Restored /workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj (in 2.44 sec).
|
|
||||||
2026-06-27T13:12:38.1827148Z Restored /workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj (in 554 ms).
|
|
||||||
2026-06-27T13:12:39.3275689Z Restored /workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj (in 1.18 sec).
|
|
||||||
2026-06-27T13:12:39.4972215Z ::group::Run dotnet clean TaxBaik.sln -c Release
|
|
||||||
2026-06-27T13:12:39.4972561Z dotnet clean TaxBaik.sln -c Release
|
|
||||||
2026-06-27T13:12:39.4972677Z dotnet build TaxBaik.sln -c Release --no-restore
|
|
||||||
2026-06-27T13:12:39.4972764Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T13:12:39.4972872Z ::endgroup::
|
|
||||||
2026-06-27T13:12:39.8626903Z Build started 06/27/2026 13:12:39.
|
|
||||||
2026-06-27T13:12:40.0580805Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.0584070Z 1>ValidateSolutionConfiguration:
|
|
||||||
2026-06-27T13:12:40.0584426Z Building solution configuration "Release|Any CPU".
|
|
||||||
2026-06-27T13:12:40.4904648Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (3) on node 2 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.4905534Z 3>CoreClean:
|
|
||||||
2026-06-27T13:12:40.4905720Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T13:12:40.5074761Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (2) on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.5076306Z 2>CoreClean:
|
|
||||||
2026-06-27T13:12:40.5076496Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T13:12:40.7637230Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj" (5:3) on node 2 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.7638013Z 5>CoreClean:
|
|
||||||
2026-06-27T13:12:40.7638224Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T13:12:40.9225801Z 2>Project "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (2) is building "/workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj" (4:4) on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9226522Z 4>CoreClean:
|
|
||||||
2026-06-27T13:12:40.9226639Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T13:12:40.9226744Z 4>Done Building Project "/workspace/***/taxbaik/TaxBaik.Domain/TaxBaik.Domain.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9226858Z 1>Project "/workspace/***/taxbaik/TaxBaik.sln" (1) is building "/workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj" (6:2) on node 1 (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9227083Z 6>CoreClean:
|
|
||||||
2026-06-27T13:12:40.9227168Z Creating directory "obj/Release/net10.0/".
|
|
||||||
2026-06-27T13:12:40.9227303Z 5>Done Building Project "/workspace/***/taxbaik/TaxBaik.Application/TaxBaik.Application.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9637330Z 6>Done Building Project "/workspace/***/taxbaik/TaxBaik.Infrastructure/TaxBaik.Infrastructure.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9637920Z 2>Done Building Project "/workspace/***/taxbaik/TaxBaik.Application.Tests/TaxBaik.Application.Tests.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9638095Z 3>Done Building Project "/workspace/***/taxbaik/TaxBaik.Web/TaxBaik.Web.csproj" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9638236Z 1>Done Building Project "/workspace/***/taxbaik/TaxBaik.sln" (Clean target(s)).
|
|
||||||
2026-06-27T13:12:40.9638387Z
|
|
||||||
2026-06-27T13:12:40.9638468Z Build succeeded.
|
|
||||||
2026-06-27T13:12:40.9638547Z 0 Warning(s)
|
|
||||||
2026-06-27T13:12:40.9638622Z 0 Error(s)
|
|
||||||
2026-06-27T13:12:40.9638697Z
|
|
||||||
2026-06-27T13:12:40.9638771Z Time Elapsed 00:00:01.09
|
|
||||||
2026-06-27T13:12:46.0603264Z TaxBaik.Domain -> /workspace/***/taxbaik/TaxBaik.Domain/bin/Release/net10.0/TaxBaik.Domain.dll
|
|
||||||
2026-06-27T13:12:47.3699743Z TaxBaik.Infrastructure -> /workspace/***/taxbaik/TaxBaik.Infrastructure/bin/Release/net10.0/TaxBaik.Infrastructure.dll
|
|
||||||
2026-06-27T13:12:47.9387429Z TaxBaik.Application -> /workspace/***/taxbaik/TaxBaik.Application/bin/Release/net10.0/TaxBaik.Application.dll
|
|
||||||
2026-06-27T13:12:48.4991412Z TaxBaik.Application.Tests -> /workspace/***/taxbaik/TaxBaik.Application.Tests/bin/Release/net10.0/TaxBaik.Application.Tests.dll
|
|
||||||
2026-06-27T13:12:53.2890716Z TaxBaik.Web -> /workspace/***/taxbaik/TaxBaik.Web/bin/Release/net10.0/TaxBaik.Web.dll
|
|
||||||
2026-06-27T13:12:53.3196351Z
|
|
||||||
2026-06-27T13:12:53.3204950Z Build succeeded.
|
|
||||||
2026-06-27T13:12:53.3208110Z 0 Warning(s)
|
|
||||||
2026-06-27T13:12:53.3209755Z 0 Error(s)
|
|
||||||
2026-06-27T13:12:53.3212460Z
|
|
||||||
2026-06-27T13:12:53.3214126Z Time Elapsed 00:00:11.71
|
|
||||||
2026-06-27T13:12:53.4987981Z ::group::Run dotnet test TaxBaik.sln -c Release --no-build
|
|
||||||
2026-06-27T13:12:53.4988381Z dotnet test TaxBaik.sln -c Release --no-build
|
|
||||||
2026-06-27T13:12:53.4988494Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T13:12:53.4988607Z ::endgroup::
|
|
||||||
2026-06-27T13:12:55.2318235Z Test run for /workspace/***/taxbaik/TaxBaik.Application.Tests/bin/Release/net10.0/TaxBaik.Application.Tests.dll (.NETCoreApp,Version=v10.0)
|
|
||||||
2026-06-27T13:12:55.4493923Z A total of 1 test files matched the specified pattern.
|
|
||||||
2026-06-27T13:12:56.3188325Z
|
|
||||||
2026-06-27T13:12:56.3224777Z Passed! - Failed: 0, Passed: 4, Skipped: 0, Total: 4, Duration: 57 ms - TaxBaik.Application.Tests.dll (net10.0)
|
|
||||||
2026-06-27T13:12:56.5314492Z ::group::Run dotnet publish TaxBaik.Web/ -c Release -o ./publish --no-restore
|
|
||||||
2026-06-27T13:12:56.5315007Z dotnet publish TaxBaik.Web/ -c Release -o ./publish --no-restore
|
|
||||||
2026-06-27T13:12:56.5315230Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T13:12:56.5315520Z ::endgroup::
|
|
||||||
2026-06-27T13:12:58.1000330Z TaxBaik.Domain -> /workspace/***/taxbaik/TaxBaik.Domain/bin/Release/net10.0/TaxBaik.Domain.dll
|
|
||||||
2026-06-27T13:12:58.2091423Z TaxBaik.Infrastructure -> /workspace/***/taxbaik/TaxBaik.Infrastructure/bin/Release/net10.0/TaxBaik.Infrastructure.dll
|
|
||||||
2026-06-27T13:12:58.2413645Z TaxBaik.Application -> /workspace/***/taxbaik/TaxBaik.Application/bin/Release/net10.0/TaxBaik.Application.dll
|
|
||||||
2026-06-27T13:12:58.9057005Z TaxBaik.Web -> /workspace/***/taxbaik/TaxBaik.Web/bin/Release/net10.0/TaxBaik.Web.dll
|
|
||||||
2026-06-27T13:13:00.7265114Z TaxBaik.Web -> /workspace/***/taxbaik/publish/
|
|
||||||
2026-06-27T13:13:00.9837459Z ::group::Run set -e
|
|
||||||
2026-06-27T13:13:00.9837788Z set -e
|
|
||||||
2026-06-27T13:13:00.9837905Z JWT_SECRET_KEY="***"
|
|
||||||
2026-06-27T13:13:00.9838015Z TELEGRAM_BOT_TOKEN=""
|
|
||||||
2026-06-27T13:13:00.9838100Z TELEGRAM_CHAT_ID=""
|
|
||||||
2026-06-27T13:13:00.9838188Z if [ -z "$JWT_SECRET_KEY" ]; then
|
|
||||||
2026-06-27T13:13:00.9838316Z echo "Missing TAXBAIK_JWT_SECRET_KEY secret" >&2
|
|
||||||
2026-06-27T13:13:00.9838463Z exit 1
|
|
||||||
2026-06-27T13:13:00.9838592Z fi
|
|
||||||
2026-06-27T13:13:00.9838738Z if [ -z "$TELEGRAM_BOT_TOKEN" ]; then
|
|
||||||
2026-06-27T13:13:00.9838884Z echo "Missing TAXBAIK_TELEGRAM_BOT_TOKEN secret" >&2
|
|
||||||
2026-06-27T13:13:00.9839022Z exit 1
|
|
||||||
2026-06-27T13:13:00.9839133Z fi
|
|
||||||
2026-06-27T13:13:00.9839242Z if [ -z "$TELEGRAM_CHAT_ID" ]; then
|
|
||||||
2026-06-27T13:13:00.9839362Z echo "Missing TAXBAIK_TELEGRAM_CHAT_ID secret" >&2
|
|
||||||
2026-06-27T13:13:00.9839500Z exit 1
|
|
||||||
2026-06-27T13:13:00.9839634Z fi
|
|
||||||
2026-06-27T13:13:00.9839746Z JWT_SECRET_KEY="$JWT_SECRET_KEY" TELEGRAM_BOT_TOKEN="$TELEGRAM_BOT_TOKEN" TELEGRAM_CHAT_ID="$TELEGRAM_CHAT_ID" python3 -c 'import json, os, pathlib; pathlib.Path("./publish/appsettings.Production.json").write_text(json.dumps({"Jwt":{"SecretKey":os.environ["JWT_SECRET_KEY"]},"Telegram":{"BotToken":os.environ["TELEGRAM_BOT_TOKEN"],"ChatId":os.environ["TELEGRAM_CHAT_ID"]}}, ensure_ascii=False, indent=2), encoding="utf-8")'
|
|
||||||
2026-06-27T13:13:00.9840007Z test -s ./publish/appsettings.Production.json
|
|
||||||
2026-06-27T13:13:00.9840139Z shell: bash --noprofile --norc -e -o pipefail {0}
|
|
||||||
2026-06-27T13:13:00.9840304Z ::endgroup::
|
|
||||||
2026-06-27T13:13:01.0404342Z Missing TAXBAIK_TELEGRAM_BOT_TOKEN secret
|
|
||||||
2026-06-27T13:13:01.0422993Z ❌ Failure - Main Write production secrets
|
|
||||||
2026-06-27T13:13:01.0609300Z exitcode '1': failure
|
|
||||||
2026-06-27T13:13:01.3080776Z evaluating expression 'success()'
|
|
||||||
2026-06-27T13:13:01.3081634Z expression 'success()' evaluated to 'false'
|
|
||||||
2026-06-27T13:13:01.3082067Z Skipping step 'Setup .NET' due to 'success()'
|
|
||||||
2026-06-27T13:13:01.3484391Z evaluating expression 'always()'
|
|
||||||
2026-06-27T13:13:01.3485123Z expression 'always()' evaluated to 'true'
|
|
||||||
2026-06-27T13:13:01.3485439Z ⭐ Run Post Checkout code
|
|
||||||
2026-06-27T13:13:01.3485680Z Writing entry to tarball workflow/outputcmd.txt len:0
|
|
||||||
2026-06-27T13:13:01.3485850Z Writing entry to tarball workflow/statecmd.txt len:0
|
|
||||||
2026-06-27T13:13:01.3485962Z Writing entry to tarball workflow/pathcmd.txt len:0
|
|
||||||
2026-06-27T13:13:01.3486254Z Writing entry to tarball workflow/envs.txt len:0
|
|
||||||
2026-06-27T13:13:01.3486364Z Writing entry to tarball workflow/SUMMARY.md len:0
|
|
||||||
2026-06-27T13:13:01.3486485Z Extracting content to '/var/run/act'
|
|
||||||
2026-06-27T13:13:01.3534554Z run post step for 'Checkout code'
|
|
||||||
2026-06-27T13:13:01.3535743Z executing remote job container: [node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]
|
|
||||||
2026-06-27T13:13:01.3802068Z 🐳 docker exec cmd=[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js] user= workdir=
|
|
||||||
2026-06-27T13:13:01.3802906Z Exec command '[node /var/run/act/actions/c3fe249fe73091a17d6638fe1341e7bd0bcc3466ce52323c0688e83e2463a4ab/dist/index.js]'
|
|
||||||
2026-06-27T13:13:01.3803683Z Working directory '/workspace/***/taxbaik'
|
|
||||||
2026-06-27T13:13:01.7057834Z [command]/usr/bin/git version
|
|
||||||
2026-06-27T13:13:01.7143894Z git version 2.54.0
|
|
||||||
2026-06-27T13:13:01.7471200Z ***
|
|
||||||
2026-06-27T13:13:01.7508945Z Temporarily overriding HOME='/tmp/e72cbe6a-85a5-4ca6-979a-839aa0ac6e27' before making global git config changes
|
|
||||||
2026-06-27T13:13:01.7511449Z Adding repository directory to the temporary git global config as a safe directory
|
|
||||||
2026-06-27T13:13:01.7538869Z [command]/usr/bin/git config --global --add safe.directory /workspace/***/taxbaik
|
|
||||||
2026-06-27T13:13:01.7699072Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
|
|
||||||
2026-06-27T13:13:01.7860087Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
|
|
||||||
2026-06-27T13:13:01.8506961Z [command]/usr/bin/git config --local --name-only --get-regexp http\.http\:\/\/gitea\:3000\/\.extraheader
|
|
||||||
2026-06-27T13:13:01.8553154Z http.http://gitea:3000/.extraheader
|
|
||||||
2026-06-27T13:13:01.8594731Z [command]/usr/bin/git config --local --unset-all http.http://gitea:3000/.extraheader
|
|
||||||
2026-06-27T13:13:01.8668773Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/gitea\:3000\/\.extraheader' && git config --local --unset-all 'http.http://gitea:3000/.extraheader' || :"
|
|
||||||
2026-06-27T13:13:01.9314873Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
|
|
||||||
2026-06-27T13:13:01.9829768Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
|
|
||||||
2026-06-27T13:13:01.9963701Z ✅ Success - Post Checkout code
|
|
||||||
2026-06-27T13:13:02.0102485Z Cleaning up container for job build-and-deploy
|
|
||||||
2026-06-27T13:13:02.4165756Z Removed container: d6313082a96795f171407814e9b27ea01af230c6493a2a782893b4c72c5a2ab3
|
|
||||||
2026-06-27T13:13:02.4180241Z 🐳 docker volume rm GITEA-ACTIONS-TASK-277-WORKFLOW-TaxBaik-CI-CD-JOB-build-and-dep-81358f67ff8537411403244208e6df1e8824d7fa599c29be44b8edde7bee1d0e
|
|
||||||
2026-06-27T13:13:02.4353218Z 🐳 docker volume rm GITEA-ACTIONS-TASK-277-WORKFLOW-TaxBaik-CI-CD-JOB-build-and-dep-81358f67ff8537411403244208e6df1e8824d7fa599c29be44b8edde7bee1d0e-env
|
|
||||||
2026-06-27T13:13:02.4957558Z 🏁 Job failed
|
|
||||||
2026-06-27T13:13:02.5089332Z Job 'build-and-deploy' failed
|
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Phase 9: 어드민 페이지별 렌더모드 정상화 (2026-07-03)
|
||||||
|
#
|
||||||
|
# DESIGN: Router/Routes에는 렌더모드를 지정하지 않고, 페이지별로 개별 지정한다.
|
||||||
|
#
|
||||||
|
# RATIONALE:
|
||||||
|
# - Blazor Web App은 "전역 렌더모드"와 "페이지별 렌더모드" 중 하나만 선택할 수 있다.
|
||||||
|
# - Router/Routes에 @rendermode를 지정하면 하위 모든 페이지의 개별 @rendermode는 무시된다.
|
||||||
|
# - 로그인만 prerender: true가 필요하고(흰 화면 방지), 나머지 [Authorize] 페이지는
|
||||||
|
# prerender: false가 필요하다(인증 컨텍스트 없이 prerender 시 AuthorizeRouteView가
|
||||||
|
# 빈 화면을 그리는 문제를 피하기 위함). 이 둘을 동시에 만족하려면 전역 지정을 버리고
|
||||||
|
# 페이지별 지정으로 가야 한다.
|
||||||
|
#
|
||||||
|
# See CLAUDE.md Phase 9 for architecture details.
|
||||||
|
|
||||||
|
app_file="src/TaxBaik.Web.Client/Components/Admin/App.razor"
|
||||||
|
routes_file="src/TaxBaik.Web.Client/Components/Admin/Routes.razor"
|
||||||
|
login_file="src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor"
|
||||||
|
|
||||||
|
for file in "$app_file" "$routes_file" "$login_file"; do
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
echo "Missing admin render file: $file" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Reject InteractiveServerRenderMode anywhere (Blazor Server architecture forbidden)
|
||||||
|
if grep -rnE "InteractiveServerRenderMode" "$app_file" "$routes_file" >/dev/null; then
|
||||||
|
echo "Admin shell must NOT use InteractiveServerRenderMode (Blazor Server)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Router/Routes must NOT declare a global rendermode boundary.
|
||||||
|
# A global rendermode on <Routes> or <Router> overrides every per-page @rendermode
|
||||||
|
# directive beneath it, which is exactly the bug this design fixes.
|
||||||
|
if grep -nE "@rendermode" "$app_file" >/dev/null; then
|
||||||
|
echo "App.razor's <Routes> must not declare a global @rendermode (breaks per-page prerender control)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -nE "@rendermode" "$routes_file" >/dev/null; then
|
||||||
|
echo "Routes.razor's <Router> must not declare a global @rendermode (breaks per-page prerender control)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Login page must explicitly prerender (shows the login form in the first HTML response).
|
||||||
|
if ! grep -nE "InteractiveWebAssemblyRenderMode\(\s*prerender:\s*true\s*\)" "$login_file" >/dev/null; then
|
||||||
|
echo "Login page must use InteractiveWebAssemblyRenderMode(prerender: true) so the form renders before WASM loads." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Only routable pages (files with a @page directive) need their own render mode.
|
||||||
|
# Child components (e.g. BlogForm.razor, FilingTable.razor) inherit the render
|
||||||
|
# mode of whichever page hosts them and must NOT declare their own.
|
||||||
|
missing_rendermode=0
|
||||||
|
while IFS= read -r -d '' page; do
|
||||||
|
[ "$page" = "$login_file" ] && continue
|
||||||
|
if ! grep -qE "^@page " "$page"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if ! grep -nE "@rendermode" "$page" >/dev/null; then
|
||||||
|
echo "⚠️ $page has no @rendermode directive (will not be interactive)." >&2
|
||||||
|
missing_rendermode=1
|
||||||
|
fi
|
||||||
|
done < <(find src/TaxBaik.Web.Client/Components/Admin/Pages -name "*.razor" -print0)
|
||||||
|
|
||||||
|
if [ "$missing_rendermode" -ne 0 ]; then
|
||||||
|
echo "One or more admin pages are missing an explicit @rendermode directive." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Admin render harness passed (per-page render mode verified)."
|
||||||
|
echo " ℹ️ Login: prerender: true (visible before WASM loads). Other pages: WebAssembly-interactive."
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
targets=(
|
||||||
|
".gitea/workflows/deploy.yml"
|
||||||
|
"deploy_gb.sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
for file in "${targets[@]}"; do
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
echo "Missing KST target file: $file" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if grep -nE 'date \+%Y%m%d_%H%M%S|date \+%Y%m%d' "${targets[@]}" | grep -v 'TZ=Asia/Seoul' >/dev/null; then
|
||||||
|
echo "Timestamp generation must use TZ=Asia/Seoul." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "KST timestamp harness passed."
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
MIGRATION_DIR="${1:-db/migrations}"
|
||||||
|
DB_CONNECTION_STRING="${2:-}"
|
||||||
|
|
||||||
|
if [ ! -d "$MIGRATION_DIR" ]; then
|
||||||
|
echo "Migration directory not found: $MIGRATION_DIR" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mapfile -t files < <(find "$MIGRATION_DIR" -maxdepth 1 -type f -name 'V*.sql' | sort)
|
||||||
|
|
||||||
|
if [ "${#files[@]}" -eq 0 ]; then
|
||||||
|
echo "No migration files found in $MIGRATION_DIR" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
declare -A seen_versions=()
|
||||||
|
duplicate_found=0
|
||||||
|
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
name="$(basename "$file")"
|
||||||
|
version="${name#V}"
|
||||||
|
version="${version%%__*}"
|
||||||
|
if [ -n "${seen_versions[$version]:-}" ]; then
|
||||||
|
echo "Duplicate migration version detected: V$version" >&2
|
||||||
|
echo " - ${seen_versions[$version]}" >&2
|
||||||
|
echo " - $file" >&2
|
||||||
|
duplicate_found=1
|
||||||
|
else
|
||||||
|
seen_versions["$version"]="$file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$duplicate_found" -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$DB_CONNECTION_STRING" ]; then
|
||||||
|
echo "Duplicate version check passed."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v psql >/dev/null 2>&1; then
|
||||||
|
echo "psql is required for database dry-run validation." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mapfile -t executed_versions < <(
|
||||||
|
psql "$DB_CONNECTION_STRING" -Atc "SELECT version FROM schema_migrations ORDER BY version;" 2>/dev/null || true
|
||||||
|
)
|
||||||
|
|
||||||
|
declare -A executed_map=()
|
||||||
|
for version in "${executed_versions[@]}"; do
|
||||||
|
if [ -n "$version" ]; then
|
||||||
|
executed_map["$version"]=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
name="$(basename "$file")"
|
||||||
|
version="${name#V}"
|
||||||
|
version="${version%%__*}"
|
||||||
|
if [ -n "${executed_map[$version]:-}" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "Dry-run migration V$version: $name"
|
||||||
|
psql "$DB_CONNECTION_STRING" -v ON_ERROR_STOP=1 <<PSQL
|
||||||
|
BEGIN;
|
||||||
|
\\i $file
|
||||||
|
ROLLBACK;
|
||||||
|
PSQL
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Migration dry-run validation passed."
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
TaxBaik.Web\Properties\launchSettings.json의 시작 설정을 사용하는 중...
|
|
||||||
빌드하는 중...
|
|
||||||
Migration warning (development only): Failed to connect to 127.0.0.1:5432
|
|
||||||
info: Microsoft.Hosting.Lifetime[14]
|
|
||||||
Now listening on: http://127.0.0.1:5055
|
|
||||||
info: Microsoft.Hosting.Lifetime[0]
|
|
||||||
Application started. Press Ctrl+C to shut down.
|
|
||||||
info: Microsoft.Hosting.Lifetime[0]
|
|
||||||
Hosting environment: Development
|
|
||||||
info: Microsoft.Hosting.Lifetime[0]
|
|
||||||
Content root path: D:\JobRoomz\taxbaik\TaxBaik.Web
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB |
+45
-3
@@ -44,15 +44,34 @@ public class BlogServiceTests
|
|||||||
Assert.Equal("같은-제목-2", post.Slug);
|
Assert.Equal("같은-제목-2", post.Slug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task DeleteAsync_SoftDeletesPost_AndExcludesFromSlugLookup()
|
||||||
|
{
|
||||||
|
var repository = new FakeBlogPostRepository
|
||||||
|
{
|
||||||
|
Posts =
|
||||||
|
[
|
||||||
|
new BlogPost { Id = 1, Title = "삭제 대상", Content = "본문", Slug = "delete-me", IsPublished = true }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
var service = new BlogService(repository, new MemoryCache(new MemoryCacheOptions()));
|
||||||
|
|
||||||
|
await service.DeleteAsync(1);
|
||||||
|
|
||||||
|
Assert.NotNull(repository.Posts.Single().DeletedAt);
|
||||||
|
Assert.Null(await service.GetBySlugAsync("delete-me"));
|
||||||
|
Assert.Null(await service.GetByIdAsync(1));
|
||||||
|
}
|
||||||
|
|
||||||
private sealed class FakeBlogPostRepository : IBlogPostRepository
|
private sealed class FakeBlogPostRepository : IBlogPostRepository
|
||||||
{
|
{
|
||||||
public List<BlogPost> Posts { get; init; } = [];
|
public List<BlogPost> Posts { get; init; } = [];
|
||||||
|
|
||||||
public Task<BlogPost?> GetByIdAsync(int id, CancellationToken cancellationToken = default) =>
|
public Task<BlogPost?> GetByIdAsync(int id, CancellationToken cancellationToken = default) =>
|
||||||
Task.FromResult(Posts.FirstOrDefault(x => x.Id == id));
|
Task.FromResult(Posts.FirstOrDefault(x => x.Id == id && x.DeletedAt == null));
|
||||||
|
|
||||||
public Task<BlogPost?> GetBySlugAsync(string slug, CancellationToken cancellationToken = default) =>
|
public Task<BlogPost?> GetBySlugAsync(string slug, CancellationToken cancellationToken = default) =>
|
||||||
Task.FromResult(Posts.FirstOrDefault(x => x.Slug == slug && x.IsPublished));
|
Task.FromResult(Posts.FirstOrDefault(x => x.Slug == slug && x.IsPublished && x.DeletedAt == null));
|
||||||
|
|
||||||
public Task<(IEnumerable<BlogPost> Items, int Total)> GetPublishedPagedAsync(
|
public Task<(IEnumerable<BlogPost> Items, int Total)> GetPublishedPagedAsync(
|
||||||
int page, int pageSize, int? categoryId = null, CancellationToken cancellationToken = default)
|
int page, int pageSize, int? categoryId = null, CancellationToken cancellationToken = default)
|
||||||
@@ -74,6 +93,13 @@ public class BlogServiceTests
|
|||||||
return Task.FromResult<(IEnumerable<BlogPost>, int)>((items, items.Count));
|
return Task.FromResult<(IEnumerable<BlogPost>, int)>((items, items.Count));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<(IEnumerable<BlogPost> Items, int Total)> GetArchivedPagedAsync(
|
||||||
|
int page, int pageSize, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var items = Posts.Where(x => x.DeletedAt != null).ToList();
|
||||||
|
return Task.FromResult<(IEnumerable<BlogPost>, int)>((items, items.Count));
|
||||||
|
}
|
||||||
|
|
||||||
public Task<int> CreateAsync(BlogPost post, CancellationToken cancellationToken = default)
|
public Task<int> CreateAsync(BlogPost post, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
post.Id = Posts.Count + 1;
|
post.Id = Posts.Count + 1;
|
||||||
@@ -83,7 +109,23 @@ public class BlogServiceTests
|
|||||||
|
|
||||||
public Task UpdateAsync(BlogPost post, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
public Task UpdateAsync(BlogPost post, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
||||||
|
|
||||||
public Task DeleteAsync(int id, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
public Task DeleteAsync(int id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var post = Posts.FirstOrDefault(x => x.Id == id);
|
||||||
|
if (post != null)
|
||||||
|
post.DeletedAt = DateTime.UtcNow;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task ArchiveAsync(int id, CancellationToken cancellationToken = default) => DeleteAsync(id, cancellationToken);
|
||||||
|
|
||||||
|
public Task RestoreAsync(int id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var post = Posts.FirstOrDefault(x => x.Id == id);
|
||||||
|
if (post != null)
|
||||||
|
post.DeletedAt = null;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
public Task IncrementViewCountAsync(int id, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
public Task IncrementViewCountAsync(int id, CancellationToken cancellationToken = default) => Task.CompletedTask;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
namespace TaxBaik.Application.Tests;
|
||||||
|
|
||||||
|
using TaxBaik.Application.Utils;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
public class BusinessDayCalculatorTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData(2026, 2, 14, 2026, 2, 19)]
|
||||||
|
[InlineData(2026, 8, 15, 2026, 8, 18)]
|
||||||
|
[InlineData(2026, 10, 3, 2026, 10, 6)]
|
||||||
|
[InlineData(2026, 9, 24, 2026, 9, 28)]
|
||||||
|
[InlineData(2027, 2, 6, 2027, 2, 10)]
|
||||||
|
[InlineData(2027, 10, 9, 2027, 10, 12)]
|
||||||
|
public void GetEffectiveDueDate_SkipsWeekendHolidayAndSubstituteHoliday(
|
||||||
|
int dueYear, int dueMonth, int dueDay,
|
||||||
|
int expectedYear, int expectedMonth, int expectedDay)
|
||||||
|
{
|
||||||
|
var effective = BusinessDayCalculator.GetEffectiveDueDate(new DateOnly(dueYear, dueMonth, dueDay));
|
||||||
|
|
||||||
|
Assert.Equal(new DateOnly(expectedYear, expectedMonth, expectedDay), effective);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(2026, 2, 19, 0)]
|
||||||
|
[InlineData(2026, 2, 20, -1)]
|
||||||
|
[InlineData(2026, 2, 18, 1)]
|
||||||
|
public void GetDday_UsesEffectiveDueDate(
|
||||||
|
int refYear, int refMonth, int refDay,
|
||||||
|
int expectedDays)
|
||||||
|
{
|
||||||
|
var dday = BusinessDayCalculator.GetDday(new DateOnly(2026, 2, 14), new DateOnly(refYear, refMonth, refDay));
|
||||||
|
|
||||||
|
Assert.Equal(expectedDays, dday);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
namespace TaxBaik.Application.Tests;
|
||||||
|
|
||||||
|
using TaxBaik.Application.Services;
|
||||||
|
using TaxBaik.Domain.Entities;
|
||||||
|
using TaxBaik.Domain.Interfaces;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
public class CommonCodeServiceTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task UpsertAsync_TrimsAndRejectsWhitespaceInCodeValue()
|
||||||
|
{
|
||||||
|
var repository = new FakeCommonCodeRepository();
|
||||||
|
var service = new CommonCodeService(repository);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<ValidationException>(() => service.UpsertAsync(new CommonCode
|
||||||
|
{
|
||||||
|
CodeGroup = " CLIENT_STATUS ",
|
||||||
|
CodeValue = "active code",
|
||||||
|
CodeName = " 활성 "
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task UpsertAsync_TrimsAndPersistsNormalizedValues()
|
||||||
|
{
|
||||||
|
var repository = new FakeCommonCodeRepository();
|
||||||
|
var service = new CommonCodeService(repository);
|
||||||
|
|
||||||
|
await service.UpsertAsync(new CommonCode
|
||||||
|
{
|
||||||
|
CodeGroup = " CLIENT_STATUS ",
|
||||||
|
CodeValue = "active",
|
||||||
|
CodeName = " 활성 ",
|
||||||
|
SortOrder = 10
|
||||||
|
});
|
||||||
|
|
||||||
|
var saved = Assert.Single(repository.SavedCodes);
|
||||||
|
Assert.Equal("CLIENT_STATUS", saved.CodeGroup);
|
||||||
|
Assert.Equal("active", saved.CodeValue);
|
||||||
|
Assert.Equal("활성", saved.CodeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class FakeCommonCodeRepository : ICommonCodeRepository
|
||||||
|
{
|
||||||
|
public List<CommonCode> SavedCodes { get; } = [];
|
||||||
|
|
||||||
|
public Task<IEnumerable<string>> GetAllGroupsAsync(CancellationToken ct = default) =>
|
||||||
|
Task.FromResult<IEnumerable<string>>([]);
|
||||||
|
|
||||||
|
public Task<IEnumerable<CommonCode>> GetByGroupAsync(string codeGroup, CancellationToken ct = default) =>
|
||||||
|
Task.FromResult<IEnumerable<CommonCode>>([]);
|
||||||
|
|
||||||
|
public Task<IEnumerable<CommonCode>> GetAllActiveAsync(CancellationToken ct = default) =>
|
||||||
|
Task.FromResult<IEnumerable<CommonCode>>([]);
|
||||||
|
|
||||||
|
public Task<CommonCode?> GetAsync(string codeGroup, string codeValue, CancellationToken ct = default) =>
|
||||||
|
Task.FromResult<CommonCode?>(null);
|
||||||
|
|
||||||
|
public Task UpsertAsync(CommonCode code, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
SavedCodes.Add(new CommonCode
|
||||||
|
{
|
||||||
|
CodeGroup = code.CodeGroup,
|
||||||
|
CodeValue = code.CodeValue,
|
||||||
|
CodeName = code.CodeName,
|
||||||
|
SortOrder = code.SortOrder,
|
||||||
|
IsActive = code.IsActive
|
||||||
|
});
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task DeleteAsync(string codeGroup, string codeValue, CancellationToken ct = default) =>
|
||||||
|
Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -80,6 +80,22 @@ public class InquiryServiceTests
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task UpdateAsync(Inquiry inquiry, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var existing = Inquiries.FirstOrDefault(x => x.Id == inquiry.Id);
|
||||||
|
if (existing != null)
|
||||||
|
{
|
||||||
|
existing.Name = inquiry.Name;
|
||||||
|
existing.Phone = inquiry.Phone;
|
||||||
|
existing.Email = inquiry.Email;
|
||||||
|
existing.ServiceType = inquiry.ServiceType;
|
||||||
|
existing.Message = inquiry.Message;
|
||||||
|
existing.Status = inquiry.Status;
|
||||||
|
existing.AdminMemo = inquiry.AdminMemo;
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
public Task LinkClientAsync(int inquiryId, int clientId, CancellationToken cancellationToken = default)
|
public Task LinkClientAsync(int inquiryId, int clientId, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var inquiry = Inquiries.FirstOrDefault(x => x.Id == inquiryId);
|
var inquiry = Inquiries.FirstOrDefault(x => x.Id == inquiryId);
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
namespace TaxBaik.Application.Tests;
|
||||||
|
|
||||||
|
using TaxBaik.Application.Seasonal;
|
||||||
|
using TaxBaik.Application.Services;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
public class SeasonalMarketingServiceTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData(2026, 1, 25, 2026, 1, 26)]
|
||||||
|
[InlineData(2026, 2, 28, 2026, 3, 3)]
|
||||||
|
[InlineData(2026, 3, 31, 2026, 3, 31)]
|
||||||
|
[InlineData(2026, 5, 31, 2026, 6, 1)]
|
||||||
|
[InlineData(2026, 7, 25, 2026, 7, 27)]
|
||||||
|
[InlineData(2026, 11, 30, 2026, 11, 30)]
|
||||||
|
[InlineData(2026, 12, 31, 2026, 12, 31)]
|
||||||
|
public void SeasonalDeadlines_ApplyBusinessDayRollForward(
|
||||||
|
int year, int month, int day,
|
||||||
|
int expectedYear, int expectedMonth, int expectedDay)
|
||||||
|
{
|
||||||
|
var deadline = new DateOnly(year, month, day);
|
||||||
|
var effective = BusinessDayCalculator.GetEffectiveBusinessDate(deadline);
|
||||||
|
|
||||||
|
Assert.Equal(new DateOnly(expectedYear, expectedMonth, expectedDay), effective);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(2026, 7, 24, 2026, 7, 27, 3)]
|
||||||
|
[InlineData(2026, 7, 25, 2026, 7, 27, 2)]
|
||||||
|
[InlineData(2026, 7, 26, 2026, 7, 27, 1)]
|
||||||
|
public void SeasonalDeadlines_UseBusinessDayDiff(
|
||||||
|
int refYear, int refMonth, int refDay,
|
||||||
|
int expectedYear, int expectedMonth, int expectedDay,
|
||||||
|
int expectedDays)
|
||||||
|
{
|
||||||
|
var deadline = new DateOnly(2026, 7, 25);
|
||||||
|
var reference = new DateOnly(refYear, refMonth, refDay);
|
||||||
|
var days = BusinessDayCalculator.GetBusinessDayDiff(deadline, reference);
|
||||||
|
|
||||||
|
Assert.Equal(expectedDays, days);
|
||||||
|
Assert.Equal(new DateOnly(expectedYear, expectedMonth, expectedDay), BusinessDayCalculator.GetEffectiveBusinessDate(deadline));
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -18,5 +18,6 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\TaxBaik.Application\TaxBaik.Application.csproj" />
|
<ProjectReference Include="..\TaxBaik.Application\TaxBaik.Application.csproj" />
|
||||||
|
<ProjectReference Include="..\TaxBaik.Web\TaxBaik.Web.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
namespace TaxBaik.Application.DTOs;
|
||||||
|
|
||||||
|
public class CreateBlogPostDto
|
||||||
|
{
|
||||||
|
public required string Title { get; set; }
|
||||||
|
public required string Content { get; set; }
|
||||||
|
public int? CategoryId { get; set; }
|
||||||
|
public string? Tags { get; set; }
|
||||||
|
public string? SeoTitle { get; set; }
|
||||||
|
public string? SeoDescription { get; set; }
|
||||||
|
public string? ThumbnailUrl { get; set; }
|
||||||
|
public bool IsPublished { get; set; }
|
||||||
|
public int? AuthorId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BlogPostResponseDto
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Title { get; set; } = string.Empty;
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
public int? CategoryId { get; set; }
|
||||||
|
public string? Tags { get; set; }
|
||||||
|
public string? SeoTitle { get; set; }
|
||||||
|
public string? SeoDescription { get; set; }
|
||||||
|
public string? ThumbnailUrl { get; set; }
|
||||||
|
public bool IsPublished { get; set; }
|
||||||
|
public int? AuthorId { get; set; }
|
||||||
|
public int ViewCount { get; set; }
|
||||||
|
public string Slug { get; set; } = string.Empty;
|
||||||
|
public DateTime CreatedAt { get; set; }
|
||||||
|
public DateTime? PublishedAt { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace TaxBaik.Application.DTOs;
|
||||||
|
|
||||||
|
public class SubmitInquiryDto
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
public string Phone { get; set; } = string.Empty;
|
||||||
|
public string? Email { get; set; }
|
||||||
|
public string ServiceType { get; set; } = string.Empty;
|
||||||
|
public string Message { get; set; } = string.Empty;
|
||||||
|
public bool SuppressNotification { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace TaxBaik.Application.DTOs;
|
||||||
|
|
||||||
|
public class UpdateInquiryDto
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
public string Phone { get; set; } = string.Empty;
|
||||||
|
public string? Email { get; set; }
|
||||||
|
public string ServiceType { get; set; } = string.Empty;
|
||||||
|
public string Message { get; set; } = string.Empty;
|
||||||
|
public string Status { get; set; } = string.Empty;
|
||||||
|
public string? AdminMemo { get; set; }
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user