Compare commits
48 Commits
0416201742
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d0ba453b0 | ||
|
|
ae902c51f4 | ||
|
|
4d3f640ecd | ||
|
|
7f87efbeb7 | ||
|
|
f318440572 | ||
|
|
0747579dcf | ||
|
|
6e97805eea | ||
|
|
57739f565a | ||
|
|
b5521765a1 | ||
| e4fd13a782 | |||
| ae999e1fac | |||
| 0176cf85e3 | |||
| 907cf90b11 | |||
|
|
e1207362de | ||
|
|
5de92fa7a1 | ||
| 0129164fd5 | |||
| 75c7a76210 | |||
| 805ff80ce8 | |||
| 2b9361c7e9 | |||
| 8573e330d6 | |||
| d1364558ee | |||
| efa5d28d1d | |||
| 1f1948e40d | |||
| 0580e5121e | |||
| f1d1b8ea93 | |||
| 2e878e24f6 | |||
| 2643f19669 | |||
| 957ded280a | |||
| d701fc3adf | |||
| df07f530f6 | |||
| 09686129b9 | |||
| 1cd4e7d4ee | |||
| f8b216bea3 | |||
| 9f7e431126 | |||
| 08846aa70f | |||
| 3125f68b66 | |||
| 269d623ca9 | |||
| ca86177e90 | |||
| a126778f16 | |||
| 1b3d03cd70 | |||
| c329891e2e | |||
| 57dde1df71 | |||
| 15bda3d3d5 | |||
| 5ad5e527a7 | |||
| 7f08417eb1 | |||
| 13bc417d45 | |||
| bf1401c32b | |||
| 2ab66fc0a3 |
@@ -1,63 +1,150 @@
|
||||
name: Build, Push, and Deploy to Nomad
|
||||
name: Build and Deploy LifeFAQ
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docker-nomad:
|
||||
runs-on: self-hosted
|
||||
build-image:
|
||||
runs-on: debian-host
|
||||
|
||||
env:
|
||||
PATH: /usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/snap/bin
|
||||
DOCKER_HOST: unix:///var/run/docker.sock
|
||||
BUILDX_CONFIG: /tmp/buildx
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Log in to Container Registry
|
||||
run: echo ${{ secrets.password }} | docker login registry.i80.dk -u ${{ secrets.username }} --password-stdin
|
||||
|
||||
- name: Build Docker Image
|
||||
- name: System info
|
||||
run: |
|
||||
COMMIT_HASH=$(git rev-parse --short HEAD)
|
||||
docker build -t registry.i80.dk/gitea/lifefaq:latest -t registry.i80.dk/gitea/lifefaq:${COMMIT_HASH} .
|
||||
uname -a
|
||||
whoami
|
||||
|
||||
|
||||
- name: Push Docker Image
|
||||
- name: Set up Docker Context for Buildx
|
||||
id: buildx-context
|
||||
run: |
|
||||
COMMIT_HASH=$(git rev-parse --short HEAD)
|
||||
echo "registry.i80.dk/gitea/lifefaq:latest"
|
||||
echo "registry.i80.dk/gitea/lifefaq:${COMMIT_HASH}"
|
||||
docker push registry.i80.dk/gitea/lifefaq:${COMMIT_HASH}
|
||||
docker push registry.i80.dk/gitea/lifefaq:latest
|
||||
export DOCKER_HOST=tcp://docker:2376/
|
||||
export DOCKER_TLS_VERIFY=0
|
||||
docker context rm builders || true
|
||||
docker context create builders
|
||||
|
||||
- name: Verify Docker
|
||||
run: docker --version
|
||||
|
||||
- name: Validate Nomad Job
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
env:
|
||||
NOMAD_ADDR: https://nomad.i80.dk
|
||||
run: nomad job validate .gitea/workflows/nomad-job.hcl
|
||||
PATH: /usr/bin:/usr/local/bin:/bin:/sbin:/usr/sbin
|
||||
|
||||
- name: Stop old deployment
|
||||
- name: Log in to Docker Registry
|
||||
run: |
|
||||
echo "${{ secrets.HARBOR_ROBOT_TOKEN }}" | docker login registry.i80.dk -u "robot\$gitserver" --password-stdin
|
||||
env:
|
||||
NOMAD_ADDR: https://nomad.i80.dk
|
||||
run: nomad job stop -purge -no-shutdown-delay lifefaq
|
||||
continue-on-error: true
|
||||
PATH: /usr/bin:/usr/local/bin:/bin:/sbin:/usr/sbin
|
||||
|
||||
- name: Check for changes
|
||||
id: changes
|
||||
uses: dorny/paths-filter@v2
|
||||
with:
|
||||
filters: |
|
||||
docker:
|
||||
- 'Dockerfile'
|
||||
- 'app/**'
|
||||
- 'requirements.txt'
|
||||
|
||||
- name: Apply Nomad Job
|
||||
- name: Build and push Docker image
|
||||
if: steps.changes.outputs.docker == 'true'
|
||||
uses: docker/build-push-action@v5
|
||||
env:
|
||||
NOMAD_ADDR: https://nomad.i80.dk
|
||||
run: nomad job run .gitea/workflows/nomad-job.hcl
|
||||
PATH: /usr/bin:/usr/local/bin:/bin:/sbin:/usr/sbin
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: true
|
||||
tags: |
|
||||
registry.i80.dk/gitea/lifefaq:latest
|
||||
|
||||
- name: Update Nginx Configuration
|
||||
run: ssh runner@nomad sudo /opt/nginx_updater/venv/bin/python3 /opt/nginx_updater/nginx_updater.py lifefaq
|
||||
- name: Test container health
|
||||
run: |
|
||||
echo "=== Starting container for health check ==="
|
||||
|
||||
- name: Update Forwarder Configuration
|
||||
run: ssh runner@nomad sudo /opt/nginx_updater/venv/bin/python3 /opt/nginx_updater/update_forwarder.py --subdomain lifefaq
|
||||
docker pull registry.i80.dk/gitea/lifefaq:latest
|
||||
|
||||
CONTAINER_ID=$(docker run -d \
|
||||
-p 8000:8000 \
|
||||
-e PORT=8000 \
|
||||
-e APP_ENV=production \
|
||||
--name lifefaq-test \
|
||||
registry.i80.dk/gitea/lifefaq:latest)
|
||||
|
||||
# - name: Restart Nomad Job
|
||||
# env:
|
||||
# NOMAD_ADDR: https://nomad.i80.dk
|
||||
# run: |
|
||||
# nomad job stop lifefaq
|
||||
# sleep 5 # Optional: Wait to ensure the old allocation is stopped
|
||||
# nomad job run .gitea/workflows/nomad-job.hcl
|
||||
echo "Container started: ${CONTAINER_ID}"
|
||||
|
||||
echo "Waiting for /health endpoint..."
|
||||
SUCCESS=false
|
||||
for i in {1..90}; do
|
||||
if curl -f -s http://localhost:8000/health > /dev/null 2>&1; then
|
||||
echo "✓ Health check passed after ${i} seconds"
|
||||
curl -s http://localhost:8000/health | jq '.' || echo "Health endpoint returned OK"
|
||||
SUCCESS=true
|
||||
break
|
||||
fi
|
||||
echo "Attempt ${i}/90 - waiting..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "=== Container Logs ==="
|
||||
docker logs lifefaq-test
|
||||
|
||||
docker stop lifefaq-test
|
||||
docker rm lifefaq-test
|
||||
|
||||
if [ "$SUCCESS" = false ]; then
|
||||
echo "✗ Health check failed after 90 seconds"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ Container health check passed - safe to deploy"
|
||||
env:
|
||||
PATH: /usr/bin:/usr/local/bin:/bin:/sbin:/usr/sbin
|
||||
|
||||
- name: Deploy to Nomad
|
||||
run: |
|
||||
nomad job validate lifefaq.nomad
|
||||
nomad job run lifefaq.nomad
|
||||
env:
|
||||
NOMAD_ADDR: "https://nomad.i80.dk:4646"
|
||||
|
||||
- name: Wait for deployment
|
||||
run: |
|
||||
echo "Checking deployment status..."
|
||||
nomad job status lifefaq
|
||||
|
||||
echo "=== Allocation Details ==="
|
||||
nomad job allocs lifefaq
|
||||
|
||||
echo "=== Getting logs from allocations ==="
|
||||
for alloc in $(nomad job allocs -all lifefaq | tail -n +2 | awk '{print $1}'); do
|
||||
echo "Logs for allocation $alloc:"
|
||||
|
||||
timeout=250
|
||||
SECONDS=0
|
||||
until nomad alloc logs "$alloc" 2>/dev/null || [ $SECONDS -gt $timeout ]; do
|
||||
echo "Waiting for allocation to start... ($SECONDS/$timeout seconds)"
|
||||
sleep 5
|
||||
done
|
||||
|
||||
[ $SECONDS -gt $timeout ] && echo "Timeout for $alloc"
|
||||
echo "---"
|
||||
done
|
||||
env:
|
||||
NOMAD_ADDR: "https://nomad.i80.dk:4646"
|
||||
|
||||
- name: Notify deployment status
|
||||
run: |
|
||||
echo "✅ Deployment completed!"
|
||||
echo "LifeFAQ should be available at: https://lifefaq.i80.dk"
|
||||
echo "Health check endpoint: https://lifefaq.i80.dk/health"
|
||||
@@ -35,11 +35,11 @@ jobs:
|
||||
NOMAD_ADDR: https://nomad.i80.dk
|
||||
run: nomad job validate .gitea/workflows/nomad-job.hcl
|
||||
|
||||
- name: Stop old deployment
|
||||
env:
|
||||
NOMAD_ADDR: https://nomad.i80.dk
|
||||
run: nomad job stop -purge -no-shutdown-delay [[PROJECT_NAME]]
|
||||
continue-on-error: true
|
||||
# - name: Stop old deployment
|
||||
# env:
|
||||
# NOMAD_ADDR: https://nomad.i80.dk
|
||||
# run: nomad job stop -purge -no-shutdown-delay [[PROJECT_NAME]]
|
||||
# continue-on-error: true
|
||||
|
||||
|
||||
- name: Apply Nomad Job
|
||||
@@ -1,4 +1,4 @@
|
||||
job "lifefaq" {
|
||||
job "lifefaq-blue" {
|
||||
region = "global"
|
||||
datacenters = ["dc1"]
|
||||
type = "service"
|
||||
@@ -6,6 +6,9 @@ job "lifefaq" {
|
||||
update {
|
||||
stagger = "60s"
|
||||
max_parallel = 1
|
||||
canary = 1
|
||||
auto_revert = true
|
||||
auto_promote = true
|
||||
progress_deadline = "6m"
|
||||
}
|
||||
|
||||
@@ -14,22 +17,18 @@ job "lifefaq" {
|
||||
|
||||
network {
|
||||
port "port-app" {
|
||||
to = 9210 # Internal application port
|
||||
to = 9210
|
||||
}
|
||||
}
|
||||
|
||||
# Register the service with Consul
|
||||
service {
|
||||
provider = "consul"
|
||||
name = "lifefaq"
|
||||
port = "port-app"
|
||||
|
||||
# Traefik-specific tags for routing
|
||||
tags = [
|
||||
"blue",
|
||||
"PORT=${NOMAD_PORT_port-app}"
|
||||
]
|
||||
|
||||
# Define a health check using TCP
|
||||
check {
|
||||
name = "tcp_check"
|
||||
type = "tcp"
|
||||
@@ -42,7 +41,7 @@ job "lifefaq" {
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "registry.i80.dk/gitea/lifefaq:latest"
|
||||
image = "registry.i80.dk/gitea/lifefaq:blue"
|
||||
ports = ["port-app"]
|
||||
}
|
||||
|
||||
59
Depriced/nomad-job-canary.hcl
Normal file
@@ -0,0 +1,59 @@
|
||||
job "lifefaq-canary" {
|
||||
region = "global"
|
||||
datacenters = ["dc1"]
|
||||
type = "service"
|
||||
|
||||
update {
|
||||
stagger = "60s"
|
||||
max_parallel = 1
|
||||
canary = 1
|
||||
auto_revert = true
|
||||
auto_promote = true
|
||||
progress_deadline = "6m"
|
||||
}
|
||||
|
||||
group "lifefaq-group" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "port-app" {
|
||||
to = 9210
|
||||
}
|
||||
}
|
||||
|
||||
service {
|
||||
provider = "consul"
|
||||
name = "lifefaq"
|
||||
port = "port-app"
|
||||
tags = [
|
||||
"canary",
|
||||
"PORT=${NOMAD_PORT_port-app}"
|
||||
]
|
||||
check {
|
||||
name = "tcp_check"
|
||||
type = "tcp"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
}
|
||||
}
|
||||
|
||||
task "lifefaq-task" {
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "registry.i80.dk/gitea/lifefaq:${COMMIT_HASH}"
|
||||
ports = ["port-app"]
|
||||
}
|
||||
|
||||
env {
|
||||
APP_ENV = "production"
|
||||
PORT = "${NOMAD_PORT_port-app}"
|
||||
}
|
||||
|
||||
resources {
|
||||
cpu = 250
|
||||
memory = 80
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
59
Depriced/nomad-job-green.hcl
Normal file
@@ -0,0 +1,59 @@
|
||||
job "lifefaq-green" {
|
||||
region = "global"
|
||||
datacenters = ["dc1"]
|
||||
type = "service"
|
||||
|
||||
update {
|
||||
stagger = "60s"
|
||||
max_parallel = 1
|
||||
canary = 1
|
||||
auto_revert = true
|
||||
auto_promote = true
|
||||
progress_deadline = "6m"
|
||||
}
|
||||
|
||||
group "lifefaq-group" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "port-app" {
|
||||
to = 9210
|
||||
}
|
||||
}
|
||||
|
||||
service {
|
||||
provider = "consul"
|
||||
name = "lifefaq"
|
||||
port = "port-app"
|
||||
tags = [
|
||||
"green",
|
||||
"PORT=${NOMAD_PORT_port-app}"
|
||||
]
|
||||
check {
|
||||
name = "tcp_check"
|
||||
type = "tcp"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
}
|
||||
}
|
||||
|
||||
task "lifefaq-task" {
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "registry.i80.dk/gitea/lifefaq:green"
|
||||
ports = ["port-app"]
|
||||
}
|
||||
|
||||
env {
|
||||
APP_ENV = "production"
|
||||
PORT = "${NOMAD_PORT_port-app}"
|
||||
}
|
||||
|
||||
resources {
|
||||
cpu = 250
|
||||
memory = 80
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
81
Depriced/waypoint.hcl
Normal file
@@ -0,0 +1,81 @@
|
||||
project = "lifefaq"
|
||||
|
||||
app "lifefaq" {
|
||||
build {
|
||||
use "docker" {
|
||||
image = "registry.i80.dk/gitea/lifefaq:latest"
|
||||
}
|
||||
}
|
||||
|
||||
deploy {
|
||||
use "nomad" {
|
||||
job = <<EOT
|
||||
job "lifefaq" {
|
||||
region = "global"
|
||||
datacenters = ["dc1"]
|
||||
type = "service"
|
||||
|
||||
update {
|
||||
stagger = "60s"
|
||||
max_parallel = 1
|
||||
canary = 1
|
||||
auto_revert = true
|
||||
auto_promote = true
|
||||
progress_deadline = "6m"
|
||||
}
|
||||
|
||||
group "lifefaq-group" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "port-app" {
|
||||
to = 9210 # Internal application port
|
||||
}
|
||||
}
|
||||
|
||||
service {
|
||||
provider = "consul"
|
||||
name = "lifefaq"
|
||||
port = "port-app"
|
||||
|
||||
tags = [
|
||||
"PORT=${NOMAD_PORT_port-app}"
|
||||
]
|
||||
|
||||
check {
|
||||
name = "tcp_check"
|
||||
type = "tcp"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
}
|
||||
}
|
||||
|
||||
task "lifefaq-task" {
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "registry.i80.dk/gitea/lifefaq:latest"
|
||||
ports = ["port-app"]
|
||||
}
|
||||
|
||||
env {
|
||||
APP_ENV = "production"
|
||||
PORT = "${NOMAD_PORT_port-app}"
|
||||
}
|
||||
|
||||
resources {
|
||||
cpu = 250
|
||||
memory = 80
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOT
|
||||
}
|
||||
}
|
||||
|
||||
release {
|
||||
use "nomad" {
|
||||
strategy = "bluegreen"
|
||||
}
|
||||
}
|
||||
13
Dockerfile
@@ -1,20 +1,13 @@
|
||||
# Base image with Python 3.11
|
||||
FROM python:3.11-slim
|
||||
|
||||
# Set the working directory in the container
|
||||
WORKDIR /app
|
||||
|
||||
# Copy the requirements file to the working directory
|
||||
COPY requirements.txt .
|
||||
|
||||
# Install Python dependencies
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copy the rest of the application code
|
||||
COPY . .
|
||||
|
||||
# Expose the port the FastAPI app runs on (default Uvicorn port)
|
||||
EXPOSE 9210
|
||||
# Port will be set via environment variable
|
||||
EXPOSE 8000
|
||||
|
||||
# Command to run the FastAPI application
|
||||
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "9210", "--workers", "1"]
|
||||
CMD ["sh", "-c", "uvicorn app.main:app --proxy-headers --host 0.0.0.0 --port ${PORT:-8000} --workers 1"]
|
||||
|
||||
BIN
FlyverPriser.ods
Normal file
47
Makefile
Normal file
@@ -0,0 +1,47 @@
|
||||
.PHONY := help install run start stop docker-build docker-rebuild docker-run docker-stop docker-logs docker-shell clean
|
||||
|
||||
PROJECT_NAME ?= lifefaq
|
||||
IMAGE_NAME ?= $(PROJECT_NAME):latest
|
||||
CONTAINER_NAME ?= $(PROJECT_NAME)-app
|
||||
PYTHON ?= python3
|
||||
UVICORN ?= uvicorn
|
||||
APP_MODULE ?= app.main:app
|
||||
PORT ?= 8000
|
||||
HOST_PORT ?= $(PORT)
|
||||
|
||||
help:
|
||||
@printf "Available targets:\n"
|
||||
@grep -E '^[a-zA-Z_-]+:.*?##' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "} {printf " %-18s %s\n", $$1, $$2}' | sort
|
||||
|
||||
install: ## Install Python dependencies
|
||||
$(PYTHON) -m pip install -r requirements.txt
|
||||
|
||||
run: ## Run the FastAPI app using app.py (no auto-reload)
|
||||
$(PYTHON) app.py
|
||||
|
||||
start: ## Start the FastAPI app with uvicorn auto-reload (foreground)
|
||||
$(UVICORN) $(APP_MODULE) --reload --host 0.0.0.0 --port $(PORT)
|
||||
|
||||
stop: ## Stop local uvicorn processes started via make start (best effort)
|
||||
-pkill -f "$(UVICORN).*$(APP_MODULE)"
|
||||
|
||||
docker-build: ## Build the Docker image
|
||||
docker build -t $(IMAGE_NAME) .
|
||||
|
||||
docker-rebuild: ## Rebuild the Docker image without cache
|
||||
docker build --no-cache -t $(IMAGE_NAME) .
|
||||
|
||||
docker-run: ## Run the Docker container in the background
|
||||
docker run --rm -d -p $(HOST_PORT):$(PORT) --name $(CONTAINER_NAME) -e PORT=$(PORT) $(IMAGE_NAME)
|
||||
|
||||
docker-stop: ## Stop the running Docker container
|
||||
-docker stop $(CONTAINER_NAME)
|
||||
|
||||
docker-logs: ## Tail logs from the Docker container
|
||||
docker logs -f $(CONTAINER_NAME)
|
||||
|
||||
docker-shell: ## Open a shell inside the running Docker container
|
||||
docker exec -it $(CONTAINER_NAME) /bin/sh
|
||||
|
||||
clean: ## Remove Python cache artifacts
|
||||
find . -name '__pycache__' -type d -prune -exec rm -rf {} +
|
||||
BIN
PortugalBudget.ods
Normal file
BIN
__pycache__/markdown_render.cpython-311.pyc
Normal file
9
app.py
@@ -1,5 +1,12 @@
|
||||
import os
|
||||
import uvicorn
|
||||
from app.main import app
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("app.main:app", host="0.0.0.0", port=9210, reload=False)
|
||||
port = int(os.getenv("PORT", 8000))
|
||||
uvicorn.run(
|
||||
"app.main:app",
|
||||
host="0.0.0.0",
|
||||
port=port,
|
||||
reload=False
|
||||
)
|
||||
BIN
app/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
app/__pycache__/main.cpython-311.pyc
Normal file
BIN
app/controllers/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
app/controllers/__pycache__/category_controller.cpython-311.pyc
Normal file
BIN
app/controllers/__pycache__/dynamic_controller.cpython-311.pyc
Normal file
BIN
app/controllers/__pycache__/route_to_web.cpython-311.pyc
Normal file
@@ -6,6 +6,9 @@ from fastapi.templating import Jinja2Templates
|
||||
from fastapi.responses import JSONResponse
|
||||
import time
|
||||
|
||||
from app.services.metadata_processor import MetadataProcessor
|
||||
|
||||
|
||||
class CategoryController:
|
||||
def __init__(self,data_file="generated_data.json"):
|
||||
"""Initialize the controller."""
|
||||
@@ -28,7 +31,10 @@ class CategoryController:
|
||||
)
|
||||
|
||||
def _load_data(self, data_file):
|
||||
"""Load JSON data from a file."""
|
||||
"""Load JSON data from a file. If the file is missing, generate it."""
|
||||
if not os.path.exists(data_file):
|
||||
print(f"{data_file} not found. Generating JSON...")
|
||||
self.generate_json() # Call the JSON generation method
|
||||
with open(data_file, "r", encoding="utf-8") as file:
|
||||
return json.load(file)
|
||||
|
||||
|
||||
10
app/main.py
@@ -2,6 +2,7 @@ from fastapi import FastAPI
|
||||
from contextlib import asynccontextmanager
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
|
||||
import app
|
||||
from app.controllers.route_to_web import RouteToWeb
|
||||
from app.services.markdown_processor import MarkdownProcessor
|
||||
from app.services.metadata_processor import MetadataProcessor
|
||||
@@ -16,11 +17,13 @@ class Application:
|
||||
self.app = FastAPI( lifespan = self._lifespan_event )
|
||||
self._set_image_sizes()
|
||||
self._setup_static_files()
|
||||
self._setup_health_route()
|
||||
self._include_routers()
|
||||
self._include_middelware()
|
||||
|
||||
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def _lifespan_event(self, app: FastAPI):
|
||||
"""Lifespan event for startup and shutdown logic."""
|
||||
@@ -51,6 +54,11 @@ class Application:
|
||||
self.app.include_router(route_to_web.router)
|
||||
self.app.include_router( image_service.router )
|
||||
|
||||
def _setup_health_route(self):
|
||||
@self.app.get("/health", tags=["Health"])
|
||||
async def health_check():
|
||||
return {"status": "ok"}
|
||||
|
||||
|
||||
def _include_middelware(self):
|
||||
self.app.add_middleware( GZipMiddleware, minimum_size = 500 )
|
||||
@@ -59,7 +67,7 @@ class Application:
|
||||
self.app.state.IMAGE_SIZES = {
|
||||
'thumbnails': {'width': 150, 'height': 150},
|
||||
'large': {'width': 800, 'height': 600},
|
||||
'small': {'width': 300, 'height': 200},
|
||||
'small': {'width': 300, 'height': 300},
|
||||
'original': {'width': None, 'height': None}, # Original størrelse
|
||||
}
|
||||
|
||||
|
||||
BIN
app/services/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
app/services/__pycache__/image_service.cpython-311.pyc
Normal file
BIN
app/services/__pycache__/markdown_processor.cpython-311.pyc
Normal file
BIN
app/services/__pycache__/markdown_render.cpython-311.pyc
Normal file
BIN
app/services/__pycache__/metadata_processor.cpython-311.pyc
Normal file
@@ -1,4 +1,6 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import HTTPException
|
||||
from fastapi.responses import FileResponse
|
||||
from fastapi import APIRouter, Request, FastAPI
|
||||
@@ -7,10 +9,9 @@ from PIL import Image
|
||||
|
||||
class FileHandler:
|
||||
|
||||
def __init__(self, category=None, image_type=None, filename=None):
|
||||
def __init__(self, category=None, image_type=None, filename=None) -> Path:
|
||||
self.filename = filename
|
||||
self.category = category
|
||||
|
||||
self.image_type = image_type
|
||||
|
||||
@property
|
||||
@@ -27,6 +28,13 @@ class FileHandler:
|
||||
def dest_filename(self) -> str:
|
||||
base_url = "static/images/{category}/{image_type}/{filename}"
|
||||
return base_url.format( category = self.category, image_type = self.image_type, filename = self.filename )
|
||||
@property
|
||||
def dest_filename_webp(self) -> str:
|
||||
base_url = "static/images/{category}/{image_type}/{filename}"
|
||||
path = Path( base_url.format( category = self.category, image_type = self.image_type, filename = self.filename ) )
|
||||
if path.suffix != ".webp":
|
||||
path = path.with_suffix( ".webp" )
|
||||
return str(path)
|
||||
|
||||
@property
|
||||
def dest_path(self) -> str:
|
||||
@@ -41,7 +49,8 @@ class FileHandler:
|
||||
f" image_type='{self.image_type}',\n"
|
||||
f" src_file='{self.src_file}',\n"
|
||||
f" dest_file='{self.dest_file}',\n"
|
||||
f" dest_filename='{self.dest_filename}'\n"
|
||||
f" dest_filename='{self.dest_filename}',\n"
|
||||
f" dest_path='{self.dest_path}'\n"
|
||||
f")"
|
||||
)
|
||||
|
||||
@@ -139,14 +148,15 @@ class ImageService:
|
||||
resized_img = img.resize( (width, height), Image.Resampling.LANCZOS )
|
||||
os.makedirs(file_path.dest_path,exist_ok = True)
|
||||
resized_img.save( file_path.dest_filename )
|
||||
|
||||
resized_img.save( file_path.dest_filename_webp, format = "WEBP", quality = 90 ) # Adjust quality as needed
|
||||
print(file_path.dest_filename_webp)
|
||||
|
||||
async def get_image(self, category: str, type: str, filename: str):
|
||||
file_path = self._resolve_path( category, type, filename )
|
||||
return FileResponse( file_path )
|
||||
|
||||
def image_tag(self, category: str, image_type: str, filename: str, alt: str = "", width: int = None,
|
||||
height: int = None) -> str:
|
||||
height: int = None,css_class:str=None) -> str:
|
||||
"""
|
||||
Generate an HTML <img> tag with default sizes if dimensions are not provided.
|
||||
"""
|
||||
@@ -155,13 +165,16 @@ class ImageService:
|
||||
width = width or default_size.get( "width" )
|
||||
height = height or default_size.get( "height" )
|
||||
file_path = FileHandler(category = category,image_type = image_type,filename = filename)
|
||||
p = Path(file_path.dest_path)
|
||||
p.mkdir(parents = True, exist_ok = True)
|
||||
self.validate_image( file_path, width = width,height=height, overwrite = True )
|
||||
|
||||
tag = f'<img src="/{file_path.dest_filename}" alt="{alt}"'
|
||||
if width:
|
||||
tag += f' width="{width}"'
|
||||
if height:
|
||||
tag += f' height="{height}"'
|
||||
tag = f'<img src="/{file_path.dest_filename_webp}" alt="{alt}"'
|
||||
# if width:
|
||||
# tag += f' width="{width}"'
|
||||
# if height:
|
||||
# tag += f' height="{height}"'
|
||||
if css_class:
|
||||
tag += f' class="{css_class}"'
|
||||
tag += ">"
|
||||
|
||||
return tag
|
||||
@@ -35,11 +35,7 @@ class MarkdownProcessor:
|
||||
list: A list of processed sections containing metadata and rendered content.
|
||||
"""
|
||||
from pathlib import Path
|
||||
|
||||
sections = []
|
||||
|
||||
|
||||
|
||||
for file in sorted(os.listdir(directory_path)):
|
||||
if file.endswith(".md"):
|
||||
file_path = os.path.join(directory_path, file)
|
||||
|
||||
@@ -123,7 +123,7 @@ class MarkdownRenderer:
|
||||
return True
|
||||
|
||||
|
||||
def get_image(self, image_type: str, filename: str, alt: str = "", width: int = None, height: int = None) -> Markup:
|
||||
def get_image(self, image_type: str, filename: str, alt: str = "", width: int = None, height: int = None,css_class:str=None) -> Markup:
|
||||
"""
|
||||
Generate a dynamic HTML <img> tag for an image using ImageService's image_tag method.
|
||||
"""
|
||||
@@ -138,7 +138,8 @@ class MarkdownRenderer:
|
||||
filename=filename,
|
||||
alt=alt,
|
||||
width=width,
|
||||
height=height
|
||||
height=height,
|
||||
css_class=css_class
|
||||
)
|
||||
return Markup(tag)
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ from typing import List, Dict
|
||||
|
||||
from fastapi import FastAPI
|
||||
|
||||
from app.services.image_service import ImageService, FileHandler
|
||||
|
||||
|
||||
class MetadataProcessor:
|
||||
"""
|
||||
@@ -22,6 +24,7 @@ class MetadataProcessor:
|
||||
"""
|
||||
self.input_dir = input_dir
|
||||
self.output_file = output_file
|
||||
self.app = app
|
||||
self.data = {"categories": [], "favorites": []}
|
||||
|
||||
def _extract_metadata(self, file_path: str) -> Dict:
|
||||
@@ -66,11 +69,25 @@ class MetadataProcessor:
|
||||
|
||||
# Add to 'favorites' if 'favorite' is true
|
||||
if metadata.get("favorite") and metadata["favorite"].lower() == "true":
|
||||
image_type = "thumbnails"
|
||||
category = os.path.relpath( root, self.input_dir ).replace( os.sep, "/" )
|
||||
filehandler = FileHandler(category=category, image_type=image_type, filename=metadata.get("image"))
|
||||
imageservice = ImageService(self.app)
|
||||
default_size = imageservice.get_image_size( image_type )
|
||||
width = default_size.get( "width" )
|
||||
height = default_size.get( "height" )
|
||||
|
||||
image_tag = imageservice.image_tag(category, image_type, metadata.get("image","Unkown"))
|
||||
print(filehandler.dest_filename_webp)
|
||||
print(image_tag)
|
||||
self.data["favorites"].append({
|
||||
"name": metadata.get("name", "Unknown"),
|
||||
"image": metadata.get("image", "images/default.jpg"),
|
||||
"image": filehandler.dest_filename_webp,
|
||||
"height": height,
|
||||
"width": width,
|
||||
"description": metadata.get("summary", "No description provided"),
|
||||
"path": os.path.relpath(root, self.input_dir).replace(os.sep, "/"),
|
||||
"path": category,
|
||||
|
||||
})
|
||||
|
||||
def generate_json(self):
|
||||
@@ -103,3 +120,4 @@ class MetadataProcessor:
|
||||
json.dump( self.data, json_file, indent = 4, ensure_ascii = False )
|
||||
|
||||
print( f"Generated JSON saved to {self.output_file}" )
|
||||
return True
|
||||
@@ -14,6 +14,8 @@ tags: [Portugal, Arbejde, EU-borgere, NIF-nummer, Socialsikring]
|
||||
|
||||
Jeg er ikke selv flyttet til Portugal endnu, men jeg har brugt en del tid på at undersøge, hvad der kræves for at arbejde der som EU-borger. Her er mine noter, baseret på det, jeg har fundet på nettet, YouTube og forskellige guides.
|
||||
|
||||
|
||||
|
||||
Som dansker kan man heldigvis arbejde i Portugal uden at skulle søge om en arbejdstilladelse. Det skyldes EU's regler om fri bevægelighed, så på det punkt er det ret ligetil.
|
||||
|
||||
Men der er nogle praktiske ting, du skal have styr på, før du kan komme i gang:
|
||||
|
||||
77
data/Arbejde/0200_hvordan_gøres_det.md
Normal file
@@ -0,0 +1,77 @@
|
||||
---
|
||||
name: Arbejde i Portugal
|
||||
description: Mine noter og fund om at arbejde i Portugal som EU-borger
|
||||
author: Henrik Jess
|
||||
date: ons 11 dec 22:16:13 CET 2024
|
||||
summary: Men hvordan gør man det så?
|
||||
favorite: false
|
||||
image: images/pic09.jpg
|
||||
category: Job
|
||||
tags: [Portugal, Arbejde, EU-borgere, NIF-nummer, Socialsikring]
|
||||
---
|
||||
## De lidt praktiske ting
|
||||
|
||||
Men der er nogle praktiske ting, du skal have styr på, før du kan komme i gang:
|
||||
|
||||
### **1. Få et NIF-nummer**
|
||||
NIF (Número de Identificação Fiscal) er dit portugisiske skatte-ID, og det er afgørende for at kunne arbejde, åbne en bankkonto eller leje en bolig.
|
||||
|
||||
{{ image('thumbnails', 'carto.jpg', alt='Mit fantatiske billed',css_class="image right") }}
|
||||
|
||||
**Sådan gør du:**
|
||||
1. **Besøg et Finanças-kontor** (det portugisiske skattevæsen) i Portugal.
|
||||
2. Medbring:
|
||||
- Dit pas eller ID-kort.
|
||||
- En midlertidig adresse i Portugal (det kan være en ven, et hotel eller en lejekontrakt).
|
||||
- Hvis du endnu ikke har fast adresse i Portugal, skal du bruge en *fiscal representative* (en person eller et firma i Portugal, der repræsenterer dig skattemæssigt). Der findes mange tjenester, der kan hjælpe online.
|
||||
3. Indsend ansøgningen, og du får normalt dit NIF med det samme.
|
||||
|
||||
|
||||
---
|
||||
|
||||
#### **2. Registrér dig i det portugisiske socialsikringssystem**
|
||||
For at kunne arbejde og få adgang til sundhedsydelser og sociale ydelser, skal du have et socialsikringsnummer (Número de Identificação da Segurança Social).
|
||||
|
||||
**Sådan gør du:**
|
||||
1. Find en lokal *Segurança Social* (socialsikringskontor).
|
||||
2. Medbring:
|
||||
- Dit NIF-nummer.
|
||||
- Din arbejds- eller ansættelseskontrakt (hvis du allerede har en).
|
||||
- Dit pas eller ID-kort.
|
||||
3. Indsend de nødvendige dokumenter. Hvis du er selvstændig, skal du udfylde en særlig formular for freelancere.
|
||||
|
||||
---
|
||||
|
||||
### **3. Åbn en portugisisk bankkonto**
|
||||
En bankkonto er nødvendig for at få løn udbetalt.
|
||||
|
||||
**Sådan gør du:**
|
||||
1. Vælg en bank, og book tid på en filial.
|
||||
2. Medbring:
|
||||
- Dit NIF-nummer.
|
||||
- Dit pas eller ID-kort.
|
||||
- Bevis på adresse (f.eks. en regning eller en lejekontrakt).
|
||||
3. Nogle banker tilbyder også online-åbning, hvilket kan være hurtigere.
|
||||
|
||||
---
|
||||
|
||||
### **4. Meld dig til SEF (Udlændingemyndighederne)**
|
||||
Hvis du planlægger at bo i Portugal i mere end tre måneder, skal du registrere dig hos SEF (Serviço de Estrangeiros e Fronteiras).
|
||||
|
||||
**Sådan gør du:**
|
||||
1. Book tid online via SEF's hjemmeside.
|
||||
2. Medbring:
|
||||
- Dit NIF-nummer.
|
||||
- Bevis på arbejde (ansættelseskontrakt eller anden dokumentation).
|
||||
- Bevis på bopæl i Portugal.
|
||||
3. Når registreringen er færdig, får du dit opholdsbevis.
|
||||
|
||||
---
|
||||
|
||||
### **Gode råd undervejs**
|
||||
- **Sprog:** Mange portugisere taler engelsk, men det kan være en fordel at have en lokal guide eller tolk med, hvis du møder bureaukratiske udfordringer.
|
||||
- **Hjælp:** Overvej at bruge tjenester som advokatfirmaer eller agenturer, der specialiserer sig i at hjælpe udlændinge med at komme i gang i Portugal. Det kan spare tid og frustration.
|
||||
|
||||
Jeg håber, denne trin-for-trin guide kan gøre det nemmere for dig at tage de første skridt. Det er en proces, der kræver lidt planlægning, men med tålmodighed er det helt klart muligt at komme godt i gang!
|
||||
|
||||
{{ box(title="Husk!", content="Jeg har ikke selv gennemgået denne proccess - så jeg har ikke fået den bekræftet endnu, den består rent af andres beretninger og online søgninger") }}
|
||||
BIN
data/Arbejde/images/carto.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
@@ -10,18 +10,38 @@ category: Bolig
|
||||
tags: [Portugal, Lissabon, Porto, Algarve, Coimbra, Viseu, Tilflyttere]
|
||||
---
|
||||
|
||||
# Hvilke områder er populære for tilflyttere?
|
||||
# Flytte til Portugal: Populære Områder og Overvejelser
|
||||
|
||||
Når man overvejer at flytte til Portugal, er der nogle områder, som skiller sig ud som særligt attraktive for tilflyttere.
|
||||
|
||||
### Populære områder:
|
||||
- **{{ link_to(title="Lissabon", url="https://www.google.com/maps?q=Lissabon") }}**: Portugals hovedstad med god infrastruktur, et levende kulturliv og mange jobmuligheder.
|
||||
- **{{ link_to(title="Porto", url="https://www.google.com/maps?q=Porto") }}**: Kendt for sin charme, historie og et voksende expat-fællesskab.
|
||||
- **{{ link_to(title="Algarve", url="https://www.google.com/maps?q=Algarve") }}**: Ideelt for dem, der søger sol, strande og en afslappet livsstil.
|
||||
## Populære Områder
|
||||
|
||||
Hvad jeg har googlet mig frem til Spænde byer jeg glæder mig til at besøge i Portugal
|
||||
|
||||
**{{ link_to(title="Lissabon", url="https://www.google.com/maps?q=Lissabon") }}** Som Portugals hovedstad byder Lissabon på en perfekt blanding af historie, moderne faciliteter og et pulserende kulturliv. Byen er et centrum for internationale virksomheder og tilbyder et rigt jobmarked, samtidig med at den imponerer med sine brostensbelagte gader og imponerende udsigter.
|
||||
|
||||
**{{ link_to(title="Porto", url="https://www.google.com/maps?q=Porto") }}** Porto er kendt for sin charme og verdensarvsbeskyttede bymidte. Byen har et blomstrende expat-fællesskab og er perfekt for dem, der søger en mere afslappet atmosfære med nem adgang til vinregionen Douro.
|
||||
|
||||
**{{ link_to(title="Algarve", url="https://www.google.com/maps?q=Algarve") }}** Dette solrige paradis er ideelt for dem, der værdsætter strande, golfbaner og en afslappet livsstil. Algarve er også kendt for at være et yndet sted for pensionister og dem, der ønsker en feriepræget tilværelse året rundt.
|
||||
|
||||
**{{ link_to(title="Braga", url="https://www.google.com/maps?q=Braga") }}** Braga er kendt som Portugals religiøse hovedstad og byder på smukke kirker, historiske monumenter og en ungdommelig vibe takket være et stort antal studerende. Byen er billigere end Lissabon og Porto, men stadig fuld af liv og aktiviteter.
|
||||
|
||||
**{{ link_to(title="Cascais", url="https://www.google.com/maps?q=Cascais") }}** For dem, der søger en luksuriøs livsstil tæt på Lissabon, er Cascais det perfekte valg. Denne kystby kombinerer en afslappet atmosfære med smukke strande, eksklusive boliger og en blomstrende expat-community.
|
||||
|
||||
**{{ link_to(title="Setúbal", url="https://www.google.com/maps?q=Setúbal") }}** Setúbal, syd for Lissabon, tilbyder smukke kyststrækninger og en rig historie. Byen er kendt for sin adgang til Arrábida-bjergene og nogle af landets bedste strande, alt sammen til en overkommelig pris.
|
||||
|
||||
## Alternativer til Storbyerne
|
||||
|
||||
For dem, der ønsker lavere boligpriser og en roligere hverdag, tilbyder Portugal mange alternativer til de travle storbyer:
|
||||
|
||||
**{{ link_to(title="Coimbra", url="https://www.google.com/maps?q=Coimbra") }}** Coimbra er en charmerende universitetsby, der kombinerer en rig historie med lavere leveomkostninger. Byen er ideel for dem, der ønsker at bo i en dynamisk, men mindre hektisk by.
|
||||
|
||||
**{{ link_to(title="Viseu", url="https://www.google.com/maps?q=Viseu") }}** Viseu er kendt for sin høje livskvalitet, smukke landskaber og prisvenlige boligmarked. Byen er perfekt for dem, der søger autentisk portugisisk kultur i en fredelig atmosfære.
|
||||
|
||||
**{{ link_to(title="Évora", url="https://www.google.com/maps?q=Évora") }}** Denne UNESCO-verdensarvsby i Alentejo-regionen er et fantastisk valg for dem, der elsker historie og tradition. Évora er kendt for sine velbevarede romerske ruiner og sin afslappede atmosfære.
|
||||
|
||||
**{{ link_to(title="Aveiro", url="https://www.google.com/maps?q=Aveiro") }}** Også kendt som "Portugals Venedig" byder Aveiro på charmerende kanaler, farverige både og en afslappet kystlivsstil. Byen er ideel for dem, der ønsker en kombination af historie og havudsigt.
|
||||
|
||||
**{{ link_to(title="Guimarães", url="https://www.google.com/maps?q=Guimarães") }}** Guimarães er kendt som "Portugal's fødested" og byder på en rig historie, fantastisk arkitektur og en hyggelig atmosfære. Det er en mindre, men kulturelt rig by, der tilbyder en autentisk portugisisk oplevelse.
|
||||
|
||||
|
||||
### Alternativer til storbyerne:
|
||||
Mindre kendte områder kan være attraktive for dem, der ønsker lavere boligpriser og en roligere livsstil:
|
||||
- **{{ link_to(title="Coimbra", url="https://www.google.com/maps?q=Coimbra") }}**: En universitetsby med historie og lavere leveomkostninger.
|
||||
- **{{ link_to(title="Viseu", url="https://www.google.com/maps?q=Viseu") }}**: Kendt for sin kvalitet af liv, smukke landskab og mere overkommelige boligpriser.
|
||||
|
||||
Uanset hvor i Portugal du vælger at bosætte dig, er der noget for enhver smag – fra travle byer med international atmosfære til mindre byer med ro og autentisk portugisisk kultur.
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
name: Mit kommende område i Portugal
|
||||
description: Planer om at flytte til Porto
|
||||
author: Henrik Jess
|
||||
date: ons 11 dec 23:10:00 CET 2024
|
||||
summary: Kort om hvorfor Porto er mit foretrukne område i Portugal
|
||||
favorite: false
|
||||
image: images/pic06.jpg
|
||||
category: Bolig
|
||||
tags: [Portugal, Porto, Flytning, Planlægning]
|
||||
---
|
||||
|
||||
# Hvilket område i Portugal planlægger jeg at flytte til?
|
||||
|
||||
Primært Porto
|
||||
@@ -37,5 +37,4 @@ Hvis du ikke er klar til at købe, er **leje** en god mulighed. Lejepriser varie
|
||||
|
||||
---
|
||||
|
||||
## Konklusion
|
||||
Boligmarkedet i Portugal byder på både muligheder og udfordringer. Mens de populære områder har højere priser, er der stadig gode alternativer i mindre byer. Når man medregner de lavere leveomkostninger i Portugal sammenlignet med Danmark, er der potentiale for at få mere værdi for pengene.
|
||||
|
||||
@@ -5,7 +5,7 @@ author: Henrik Jess
|
||||
date: ons 11 dec 23:25:00 CET 2024
|
||||
summary: Fødevarer er markant billigere i Portugal med få undtagelser som bær og specialvarer.
|
||||
favorite: true
|
||||
image: images/budget2.jpg
|
||||
image: budget2.jpg
|
||||
category: Økonomi
|
||||
tags: [Portugal, Budget, Økonomi]
|
||||
---
|
||||
|
||||
BIN
data/Budget/images/budget2.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
44
data/Flytning/0500_lidt_billeder_af_lejligheder.md
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
name: Lejligheder i Porto
|
||||
description: Detaljer om lejligheder til leje i Porto med praktiske informationer for EU-borgere
|
||||
author: Henrik Jess
|
||||
date: ons 11 dec 23:40:00 CET 2024
|
||||
summary: To lejligheder i Porto med specifikationer, priser og billeder
|
||||
favorite: false
|
||||
image: images/pic04.jpg
|
||||
category: Bolig
|
||||
tags: [Portugal, Bolig, Leje, Porto, EU-borger, Flytning]
|
||||
---
|
||||
|
||||
|
||||
# Lejlighed i Porto
|
||||
|
||||
Dette er en lejlighed beliggende i Porto på Rua 28 de Janeiro, Candal - Regadas, Santa Marinha e São Pedro da Afurada.
|
||||
|
||||
Lejligheden har en månedlig husleje på **1.200 euro** og indeholder følgende:
|
||||
|
||||
- **3 værelser**, hvoraf 1 er et ensuite-værelse
|
||||
- **1 badeværelse**
|
||||
- **1 gæstetoilet**
|
||||
- **Stue og køkken** i åben plan
|
||||
- **1 balkon**, der deles mellem alle fire værelser
|
||||
- **1 balkon** tilknyttet køkkenet
|
||||
- **1 opbevaringsrum** på 10 m²
|
||||
- **2 parkeringspladser**
|
||||
|
||||
{{ slider(options={"width": 500, "height": 500}, images=["lejlighed2/Appartment_20250107_214352.png","lejlighed2/Appartment_20250107_214411.png","lejlighed2/Appartment_20250107_214423.png","lejlighed2/Appartment_20250107_214436.png","lejlighed2/Appartment_20250107_214446.png","lejlighed2/Appartment_20250107_214455.png","lejlighed2/Appartment_20250107_214504.png","lejlighed2/Appartment_20250107_214625.png","lejlighed2/Appartment_20250107_214639.png","lejlighed2/Appartment_20250107_214712.png","lejlighed2/Appartment_20250107_214733.png","lejlighed2/Appartment_20250107_214822.png","lejlighed2/Appartment_20250107_214843.png"]) }}
|
||||
|
||||
---
|
||||
|
||||
Dette er endnu lejlighed beliggende i Porto
|
||||
|
||||
Lejligheden har en månedlig husleje på **1.050 euro** og indeholder følgende:
|
||||
|
||||
- **3 værelser**
|
||||
- **1 badeværelse**
|
||||
- **1 gæstetoilet**
|
||||
- **Stue og køkken** i åben plan
|
||||
- **1 balkon**, der deles mellem alle fire værelser
|
||||
- **1 balkon** tilknyttet køkkenet
|
||||
|
||||
{{ slider(options={"width": 500, "height": 500}, images=["lejlighed1/Appartment_20250106_205457-2.png","lejlighed1/Appartment_20250106_205634.png","lejlighed1/Appartment_20250106_205648.png","lejlighed1/Appartment_20250106_205657.png","lejlighed1/Appartment_20250106_205706.png","lejlighed1/Appartment_20250106_205714.png","lejlighed1/Appartment_20250106_205728-1.png","lejlighed1/Appartment_20250106_205744.png","lejlighed1/Appartment_20250106_205755.png","lejlighed1/Appartment_20250106_205806.png","lejlighed1/Appartment_20250106_205816.png","lejlighed1/Appartment_20250106_205835.png","lejlighed1/Appartment_20250106_205842.png","lejlighed1/Appartment_20250106_205852.png","lejlighed1/Appartment_20250106_205901.png","lejlighed1/Appartment_20250106_205909.png","lejlighed1/Appartment_20250106_205918.png","lejlighed1/Appartment_20250106_205928.png","lejlighed1/Appartment_20250106_205936.png","lejlighed1/Appartment_20250106_205946.png","lejlighed1/Appartment_20250106_205955.png"]) }}
|
||||
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205457-2.png
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205634.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205648.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205657.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205706.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205714.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205728-1.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205744.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205755.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205806.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205816.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205835.png
Normal file
|
After Width: | Height: | Size: 988 KiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205842.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205852.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205901.png
Normal file
|
After Width: | Height: | Size: 818 KiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205909.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205918.png
Normal file
|
After Width: | Height: | Size: 951 KiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205928.png
Normal file
|
After Width: | Height: | Size: 823 KiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205936.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205946.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
data/Flytning/images/lejlighed1/Appartment_20250106_205955.png
Normal file
|
After Width: | Height: | Size: 721 KiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214352.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214411.png
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214423.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214436.png
Normal file
|
After Width: | Height: | Size: 911 KiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214446.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214455.png
Normal file
|
After Width: | Height: | Size: 762 KiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214504.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214625.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214639.png
Normal file
|
After Width: | Height: | Size: 816 KiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214712.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214733.png
Normal file
|
After Width: | Height: | Size: 864 KiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214822.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
data/Flytning/images/lejlighed2/Appartment_20250107_214843.png
Normal file
|
After Width: | Height: | Size: 936 KiB |
@@ -1,27 +0,0 @@
|
||||
---
|
||||
name: Fritidsaktiviteter i Portugal
|
||||
description: Aktiviteter og oplevelser i Portugals varierede landskab
|
||||
author: Henrik Jess
|
||||
date: ons 11 dec 23:50:00 CET 2024
|
||||
summary: Surfing, vandreture og strande – oplev Portugal
|
||||
favorite: false
|
||||
image: images/pic07.jpg
|
||||
category: Fritid
|
||||
tags: [Portugal, Fritid, Surfing, Vandreture, Strande, Aktiviteter, Vandsport]
|
||||
---
|
||||
|
||||
# Hvilke fritidsaktiviteter kan jeg nyde i Portugal?
|
||||
|
||||
Portugal er et fantastisk land for både aktive og afslappende fritidsaktiviteter. Landets varierede landskab betyder, at der er noget for enhver smag.
|
||||
|
||||
### Aktive oplevelser
|
||||
- **Surfing og vandsport**: Portugal er kendt for sine fremragende surfspots, især ved kystområder som **Nazaré**, **Ericeira** og **Peniche**.
|
||||
- **Vandreture**: De smukke bjergområder som **Serra da Estrela** byder på udfordrende og naturskønne ruter.
|
||||
- **Cykling**: Mange vælger at udforske landskabet på cykel, hvad enten det er langs kysten eller i det bakkede terræn.
|
||||
|
||||
### Afslappende aktiviteter
|
||||
- **Strandliv**: Portugals kyststrækning har nogle af Europas bedste strande, perfekte til afslapning og solbadning.
|
||||
- **Vinoplevelser**: Besøg vingårde i **Douro-dalen** og smag på lokalproduceret vin.
|
||||
- **Kultur og historie**: Tag på opdagelse i charmerende byer som **Sintra**, **Óbidos** og **Évora**.
|
||||
|
||||
Uanset om du er til eventyr i naturen eller bare vil slappe af med udsigt over Atlanterhavet, har Portugal masser at byde på.
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
name: Fordele og ulemper ved at flytte til Portugal
|
||||
description: De største fordele og ulemper ved at flytte til Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:10:00 CET 2024
|
||||
summary: Lavere leveomkostninger, mildt klima og bureaukratiske udfordringer
|
||||
favorite: false
|
||||
image: images/pic01.jpg
|
||||
category: Flytning
|
||||
tags: [Portugal, Fordele, Ulemper, Leveomkostninger, Klima, Bureaukrati, Sprog]
|
||||
---
|
||||
|
||||
# Hvad er fordelene og ulemperne ved at flytte til Portugal?
|
||||
|
||||
Jeg har samlet mine tanker og observationer om de største fordele og ulemper ved at flytte til Portugal, baseret på den research jeg har lavet.
|
||||
|
||||
### Fordele
|
||||
- **Lavere leveomkostninger**: Sammenlignet med Danmark er det billigere at bo, spise og leve i Portugal. Det gælder især uden for storbyerne.
|
||||
- **Mildt klima**: Med mange solskinsdage og milde vintre er vejret i Portugal et stort plus, især hvis man er træt af den danske kulde.
|
||||
- **Frisk start og livsstil**: Portugal tilbyder en mere afslappet livsstil, som jeg tror, mange kunne have glæde af.
|
||||
|
||||
### Ulemper
|
||||
- **Bureaukrati**: Der er mange historier om, at bureaukratiske processer kan være langsomme og forvirrende, især hvis man ikke taler portugisisk.
|
||||
- **Sproglige barrierer**: Selvom mange portugisere taler engelsk i de større byer, kan det være en udfordring at klare sig i hverdagen uden at kunne sproget.
|
||||
|
||||
Portugal virker som et land med mange muligheder, men det kræver forberedelse og tålmodighed at få det hele til at fungere.
|
||||
@@ -1,30 +0,0 @@
|
||||
---
|
||||
name: Økonomiske konsekvenser ved at flytte til Portugal
|
||||
description: Fordele og ulemper ved økonomi og skatteforhold i Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:20:00 CET 2024
|
||||
summary: Lavere omkostninger og ændringer i skatteforhold ved flytning
|
||||
favorite: false
|
||||
image: images/pic01.jpg
|
||||
category: Økonomi
|
||||
tags: [Portugal, Økonomi, Skat, Leveomkostninger, Boligskatter, Danske ydelser]
|
||||
---
|
||||
|
||||
# Hvilke økonomiske konsekvenser er der for mig ved at flytte til Portugal?
|
||||
|
||||
Jeg har gjort mig nogle tanker og undersøgelser om, hvad det økonomisk betyder at flytte til Portugal. Her er, hvad jeg er kommet frem til:
|
||||
|
||||
### Fordele
|
||||
- **Lavere leveomkostninger**: De månedlige udgifter til bolig, mad og transport er typisk lavere end i Danmark, især hvis man vælger at bo uden for de største byer.
|
||||
- **Skatteforhold**: Afhængigt af ens situation kan skatten være lavere i Portugal, men det kræver en vurdering af de portugisiske regler sammenlignet med de danske.
|
||||
|
||||
### Ulemper
|
||||
- **Danske ydelser**: Hvis man fjerner sin danske adresse og bliver fuldt skattepligtig i Portugal, risikerer man at miste adgang til visse danske ydelser.
|
||||
- **Boligskatter**: Selvom man kan spare danske boligskatter ved at fjerne sin adresse, skal man være opmærksom på de portugisiske skatter som **IMI** (ejendomsskat) og **IMT** (købsskat).
|
||||
|
||||
### Overvejelser
|
||||
Hvis man planlægger at flytte, er det vigtigt at:
|
||||
1. Undersøge de nøjagtige skatteforhold og indberetningskrav i Portugal.
|
||||
2. Tage højde for, hvad det betyder at opgive sin danske bopæl, både økonomisk og administrativt.
|
||||
|
||||
Alt i alt ser det ud til, at Portugal kan give nogle økonomiske fordele, men det kræver planlægning og forståelse for, hvordan det påvirker skatten og andre økonomiske forhold.
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
name: Uddannelsesmuligheder i Portugal for børn
|
||||
description: Muligheder for gymnasier og internationale skoler i Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:15:00 CET 2024
|
||||
summary: Internationale skoler og portugisiske gymnasier for børn
|
||||
favorite: false
|
||||
image: images/pic02.jpg
|
||||
category: Uddannelse
|
||||
tags: [Portugal, Uddannelse, Gymnasier, Internationale skoler, STX, Børn]
|
||||
---
|
||||
|
||||
# Hvad er uddannelsesmulighederne i Portugal for mine børn?
|
||||
|
||||
Jeg har brugt tid på at undersøge, hvilke uddannelsesmuligheder der findes i Portugal, særligt fordi min datter på 16 år overvejer at tage en STX (studentereksamen) i Danmark. Her er, hvad jeg har fundet:
|
||||
|
||||
### Portugisiske gymnasier
|
||||
Portugals gymnasiale uddannelser minder på mange måder om det danske system, men både pensum og undervisningssproget er naturligvis anderledes. Hvis man ikke taler portugisisk flydende, kan det være en udfordring, især i begyndelsen.
|
||||
|
||||
### Internationale skoler
|
||||
Et oplagt alternativ er internationale skoler, der tilbyder undervisning på engelsk og ofte følger internationale curriculum som **International Baccalaureate (IB)**.
|
||||
Nogle fordele ved internationale skoler inkluderer:
|
||||
- Mulighed for at fortsætte på et globalt anerkendt pensum.
|
||||
- God støtte til elever, der er nye i landet.
|
||||
- Mange skoler har en stor blanding af elever fra forskellige nationaliteter.
|
||||
|
||||
### Overvejelser
|
||||
Når man vælger mellem portugisiske gymnasier og internationale skoler, er det værd at tænke over:
|
||||
- Sprogbarrierer og tilpasning til nyt pensum.
|
||||
- Økonomien – internationale skoler kan være dyrere.
|
||||
- Hvilken uddannelsesretning der passer bedst til fremtidige planer.
|
||||
|
||||
Der er mange gode muligheder, men det kræver lidt research at finde det, der passer bedst til ens børn og familiens behov.
|
||||
25
data/Generalt/0100_general_fordele_ulemper.md
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
name: Lige det genneralle ord..
|
||||
description: De største fordele og ulemper ved at flytte til Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:10:00 CET 2024
|
||||
summary: Lavere leveomkostninger, mildt klima og bureaukratiske udfordringer
|
||||
favorite: true
|
||||
image: portugal.jpg
|
||||
category: Flytning
|
||||
tags: [Portugal, Fordele, Ulemper, Leveomkostninger, Klima, Bureaukrati, Sprog]
|
||||
---
|
||||
|
||||
## Fordele ved at flytte til Portugal
|
||||
|
||||
**Lavere leveomkostninger** Portugal tilbyder generelt lavere leveomkostninger sammenlignet med Danmark. Boliger, mad og offentlig transport er markant billigere, og selv i storbyer som Lissabon og Porto er det muligt at finde prisvenlige alternativer. Dette giver plads til en mere afslappet økonomisk hverdag, hvor der er råd til flere oplevelser og investeringer i personlig velvære. **Et mildt og solrigt klima** Portugal er kendt for sit behagelige klima, der byder på varme somre og milde vintre. Solrige dage er normen, og den naturlige skønhed med strande, bjerge og vinmarker bidrager til en livskvalitet, der er svær at matche i Danmark. **En ny livsstil og kulturel rigdom** Den portugisiske livsstil er rodfæstet i afslappethed og nærvær. Familieværdier, lokal gastronomi og et tempo, der giver tid til at nyde livet, kan være en væsentlig forandring fra den hurtige og målorienterede hverdag i Danmark. Derudover byder Portugal på en righoldig historie og kultur, som man kan fordybe sig i, fra fado-musik til arkitektoniske mesterværker.
|
||||
|
||||
|
||||
## Udfordringer ved at flytte til Portugal
|
||||
|
||||
**Bureaukratiske hurdler** Et tilbagevendende tema blandt expats i Portugal er de komplekse og langsomme bureaukratiske processer. Det kan være frustrerende at navigere i papirarbejdet, såsom at oprette et skattenummer (NIF), registrere sig som beboer eller åbne en bankkonto. Tålmodighed og muligvis professionel hjælp kan være afgørende. **Sproglige barrierer** Selvom mange portugisere taler engelsk, specielt i storbyer og turistområder, kan det være en udfordring at klare sig uden at kende det portugisiske sprog. Hverdagsopgaver som at handle, besøge lægen eller deltage i lokale begivenheder kan være mere overkommelige med et grundlæggende kendskab til sproget. **Pendling mellem to lande** At arbejde i Danmark og bo i Portugal lyder idyllisk, men det kræver en omhyggelig planlægning. Pendling kan være tidskrævende og dyrt, men med et effektivt skema kan det også være en mulighed for at få det bedste fra begge verdener. For mig betyder det at bruge hver anden uge i Danmark og nyde livet i Portugal resten af tiden.
|
||||
|
||||
|
||||
## Hvorfor Portugal?
|
||||
|
||||
Portugal repræsenterer for mig en frisk start – en mulighed for at genoverveje, hvordan jeg lever mit liv. Det er ikke kun en fysisk flytning, men også en mental forandring, der handler om at prioritere det, der virkelig betyder noget: familie, sundhed og livskvalitet. Samtidig kan en flytning til Portugal give en professionel kant, da det viser evnen til at tilpasse sig og operere i forskellige kulturer og kontekster. Portugal er ikke kun et sted at bo; det er en mulighed for at leve på en måde, der føles autentisk og meningsfuld. Med de rette forberedelser og en fleksibel tilgang er det en beslutning, der kan forbedre ens liv på mange måder.
|
||||
43
data/Generalt/0200_general_økonomiske_konsekvenser.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: Lige det genneralle ord..
|
||||
description: Fordele og ulemper ved økonomi og skatteforhold i Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:20:00 CET 2024
|
||||
summary: Lavere omkostninger og ændringer i skatteforhold ved flytning
|
||||
favorite: false
|
||||
image: images/pic01.jpg
|
||||
category: Økonomi
|
||||
tags: [Portugal, Økonomi, Skat, Leveomkostninger, Boligskatter, Danske ydelser]
|
||||
---
|
||||
|
||||
# Lidt Tanker
|
||||
|
||||
At overveje at flytte til Portugal er en beslutning, der åbner op for en verden af nye muligheder og udfordringer. Fra kulturelle skatte og økonomiske fordele til en forbedret livskvalitet er Portugal mere end bare en destination – det kan repræsentere en ny begyndelse. Som en professionel, der arbejder i Danmark, men drømmer om at bo i Portugal, vil jeg her dele mine tanker om, hvad det indebærer at tage dette skridt, samt udforske pendlingens realiteter og dens indflydelse på livsstilen.
|
||||
|
||||
{{ image('small', 'portugal.jpg', alt='Mit fantatiske billed',css_class="image right") }}
|
||||
|
||||
## Hvilke økonomiske konsekvenser er der for mig ved at flytte til Portugal?
|
||||
|
||||
### Fordele
|
||||
|
||||
**Lavere leveomkostninger** Portugal tilbyder generelt lavere leveomkostninger sammenlignet med Danmark. Boliger, mad og offentlig transport er markant billigere, og selv i storbyer som Lissabon og Porto er det muligt at finde prisvenlige alternativer. Dette giver plads til en mere afslappet økonomisk hverdag med råd til flere oplevelser og investeringer i personlig velvære.
|
||||
|
||||
**Skatteforhold** Afhængigt af ens situation kan skatten være lavere i Portugal, specielt hvis man kvalificerer sig til programmer som Non-Habitual Residency (NHR). Dette kan reducere skattebyrden på indkomst og pensioner, men det kræver en grundig vurdering af de portugisiske regler sammenlignet med de danske. Da jeg arbejder som DevOps-udvikler, er jeg berettiget til NHR-programmet under 2024/Q3-reglementet.
|
||||
|
||||
### Ulemper
|
||||
|
||||
**Danske ydelser** Hvis man fjerner sin danske adresse og bliver fuldt skattepligtig i Portugal, risikerer man at miste adgang til visse danske ydelser, som folkepension og sundhedsydelser. Derfor er det vigtigt at analysere, hvad man eventuelt giver afkald på. Eksempelvis skal man som regel bo i Portugal i mindst 5 år som fastboende med gyldig opholdstilladelse for at kunne ansøge om portugisisk statsborgerskab. Dette kan dog variere afhængigt af ens specifikke situation og tidligere ophold. Portugisisk statsborgerskab kan være attraktivt for dem, der ønsker at få stemmeret i Portugal, bedre adgang til sociale ydelser eller nyde fordele som fri bevægelighed inden for EU. Disse rettigheder kan øge ens sikkerhed og fleksibilitet, både professionelt og personligt.
|
||||
|
||||
**Boligskatter** Selvom man kan spare danske boligskatter ved at fjerne sin adresse, skal man være opmærksom på de portugisiske skatter som IMI (ejendomsskat) og IMT (købsskat), der kan tilføje ekstra omkostninger, hvis man ønsker en fast bolig i Portugal. Samtidig skal man være bevidst om, at hvis man udlejer sin faste ejendom i Danmark, skal dette ske i minimum 3 år uden mulighed for opsigelse.
|
||||
|
||||
**Pendling mellem to lande** Pendling mellem Danmark og Portugal kan være dyrt og tidskrævende. Flybilletter, transporttid og koordinering af arbejde og privatliv kræver en struktureret tilgang, men det giver også mulighed for at få det bedste fra begge verdener. Jeg befinder mig i øjeblikket i en fase, hvor SKAT har oplyst, at jeg kan få befordringsfradrag for rejser mellem Portugal og Danmark de dage, jeg arbejder i Danmark, samtidig med at jeg nyder godt af NHR-programmet i Portugal. Denne ordning mangler dog at blive endeligt afkræftet, og jeg har en separat sektion til dette emne. Derudover har TAP Portugal et medlemsprogram, som kan være fordelagtigt for hyppige rejsende, og jeg er i gang med at forhandle en fastprisaftale for faste rejser mellem Danmark og Portugal, hvilket yderligere kan reducere omkostninger og lette pendlingen.
|
||||
|
||||
### Overvejelser
|
||||
|
||||
Hvis man planlægger at flytte, er det vigtigt at:
|
||||
|
||||
1. Undersøge de nøjagtige skatteforhold og indberetningskrav i Portugal.
|
||||
2. Tage højde for, hvad det betyder at opgive sin danske bopæl, både økonomisk og administrativt.
|
||||
3. Lave en realistisk plan for pendling og budgettering.
|
||||
|
||||
|
||||
43
data/Generalt/0300_general_uddannelse_børn.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: Lige det genneralle ord..
|
||||
description: Muligheder for gymnasier og internationale skoler i Portugal
|
||||
author: Henrik Jess
|
||||
date: tor 12 dec 01:15:00 CET 2024
|
||||
summary: Internationale skoler og portugisiske gymnasier mit barn
|
||||
favorite: false
|
||||
image: images/pic02.jpg
|
||||
category: Uddannelse
|
||||
tags: [Portugal, Uddannelse, Gymnasier, Internationale skoler, STX, Børn]
|
||||
---
|
||||
|
||||
# Uddannelsesmuligheder for mit barn
|
||||
|
||||
At overveje en flytning til Portugal rejser mange spørgsmål – ikke mindst når det kommer til mine børns uddannelse. Min datter på 16 år står overfor valget om at tage en STX (studentereksamen) i Danmark eller finde en tilsvarende mulighed i Portugal. Her er, hvad jeg har fundet i min research om uddannelsesmulighederne i Portugal.
|
||||
|
||||
## Portugisiske gymnasier
|
||||
Det portugisiske uddannelsessystem tilbyder gymnasiale uddannelser, der minder om det danske system. Uddannelsen er inddelt i forskellige retninger, hvor elever kan vælge humanistiske, naturvidenskabelige eller tekniske fagpakker.
|
||||
Undervisningssproget er naturligvis portugisisk, hvilket kan være en barriere, dog kan et forløb med intensiv sproglæring lette overgangen og enkelte skoler tilbyder undervisning på Engelsk.
|
||||
|
||||
### Fordele ved portugisiske gymnasier
|
||||
- Integrering i den lokale kultur og samfund.
|
||||
- Lavere omkostninger sammenlignet med internationale skoler.
|
||||
- Mulighed for at lære portugisisk – et værdifuldt sprog i en globaliseret verden.
|
||||
|
||||
## Internationale skoler
|
||||
Internationale skoler i Portugal er en populær mulighed for expat-familier. Mange af disse skoler tilbyder undervisning på engelsk og følger anerkendte pensum som **International Baccalaureate (IB)** eller britiske og amerikanske curriculum. Dette giver eleverne en uddannelse, der åbner døre til universiteter verden over.
|
||||
|
||||
### Fordele ved internationale skoler
|
||||
- Undervisning på engelsk, hvilket gør overgangen lettere.
|
||||
- Støtte til elever, der er nye i landet.
|
||||
- En international atmosfære med mange nationaliteter.
|
||||
|
||||
### Udfordringer
|
||||
- Højere skolegebyrer end i det offentlige system.
|
||||
- Begrænset antal pladser på populære skoler.
|
||||
|
||||
## Overvejelser for familien
|
||||
Valget mellem portugisiske gymnasier og internationale skoler afhænger af flere faktorer:
|
||||
1. **Sprog:** Skal mit barn lære portugisisk, eller vil det være lettere at fortsætte på engelsk?
|
||||
2. **Økonomi:** Er vi villige til at betale for en privat skole, hvis det betyder en lettere overgang?
|
||||
3. **Fremtidsplaner:** Hvilken uddannelsesretning understøtter mine børns karrieremål bedst?
|
||||
|
||||
BIN
data/Generalt/images/portugal.jpg
Normal file
|
After Width: | Height: | Size: 100 KiB |
@@ -26,5 +26,5 @@ Portugal har en stærk musikscene med alt fra live-fado til moderne musik:
|
||||
### Strandbarer og afslappede vibes
|
||||
Langs kysten, især i Algarve, finder man strandbarer, hvor man kan nyde drinks med fødderne i sandet og en smuk solnedgang.
|
||||
|
||||
### Konklusion
|
||||
|
||||
Portugals natteliv har alt fra rolige barer og livemusik til energiske natklubber. Uanset om du vil danse natten væk i en storby eller nyde en cocktail med udsigt over havet, har Portugal noget at byde på.
|
||||
@@ -30,7 +30,7 @@ Ligesom i København, hvor du finder både små biografer som Grand Teatret og s
|
||||
|
||||
|
||||
|
||||
{{ slider(options={"width": 500, "height": 500}, images=["158170.jpg", "Fachada_SaoJorge.jpg"]) }}
|
||||
{{ slider(options={"width": 500, "height": 500}, images=["158170.jpg", "Fachada_SaoJorge.jpg","IMG_8644-scaled.webp"]) }}
|
||||
|
||||
Biografbesøg i Lissabon er en afslappet måde at tilbringe tid med familien. Jeg nyder selv at tage afsted med Erika for at dele både film og hygge.
|
||||
|
||||
74
data/Hverdag/0900_fritid_aktiviteter.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
name: Fritidsaktiviteter i Portugal
|
||||
description: Aktiviteter og oplevelser i Portugals varierede landskab
|
||||
author: Henrik Jess
|
||||
date: ons 11 dec 23:50:00 CET 2024
|
||||
summary: Surfing, vandreture og strande – oplev Portugal
|
||||
favorite: false
|
||||
image: images/pic07.jpg
|
||||
category: Fritid
|
||||
tags: [Portugal, Fritid, Surfing, Vandreture, Strande, Aktiviteter, Vandsport]
|
||||
---
|
||||
|
||||
# Hvilke fritidsaktiviteter kan jeg nyde i Portugal?
|
||||
|
||||
Portugal er et fantastisk land for både aktive og afslappende fritidsaktiviteter. Landets varierede landskab betyder, at der er noget for enhver smag.
|
||||
|
||||
### Aktive oplevelser
|
||||
**Surfing og vandsport**: Portugal er kendt for sine fremragende surfspots, især ved kystområder som **Nazaré**, **Ericeira** og **Peniche**.
|
||||
**Vandreture**: De smukke bjergområder som **Serra da Estrela** byder på udfordrende og naturskønne ruter.
|
||||
**Cykling**: Mange vælger at udforske landskabet på cykel, hvad enten det er langs kysten eller i det bakkede terræn.
|
||||
|
||||
### Afslappende aktiviteter
|
||||
**Strandliv**: Portugals kyststrækning har nogle af Europas bedste strande, perfekte til afslapning og solbadning.
|
||||
**Vinoplevelser**: Besøg vingårde i **Douro-dalen** og smag på lokalproduceret vin.
|
||||
**Kultur og historie**: Tag på opdagelse i charmerende byer som **Sintra**, **Óbidos** og **Évora**.
|
||||
|
||||
Uanset om du er til eventyr i naturen eller bare vil slappe af med udsigt over Atlanterhavet, har Portugal masser at byde på.
|
||||
|
||||
## Vandreture i Portugal
|
||||
|
||||
Portugal byder på en lang række fantastiske vandreture, der kombinerer betagende natur, historiske omgivelser og en autentisk kulturel oplevelse. Uanset om du søger bjergudfordringer eller afslappede kystture, er der noget for enhver smag.
|
||||
|
||||
**Rota Vicentina** En kystnær vandresti langs Alentejo og Algarve, som tilbyder udsigt over Atlanterhavet og frodig natur. {{ link_to(url="https://rotavicentina.com/", title="Rota Vicentina") }}
|
||||
|
||||
**Peneda-Gerês Nationalpark** Oplev Portugals eneste nationalpark, der byder på dramatiske landskaber, skove og traditionelle landsbyer. {{ link_to(url="https://www.walkingpenedageres.pt/en/", title="Peneda-Gerês Nationalpark") }}
|
||||
|
||||
**Sete Vales Suspensos (De Syv Hængende Dale)** En spektakulær rute i Algarve-regionen, der følger kysten med klipper og skjulte strande. {{ link_to(url="https://www.visitalgarve.pt/", title="Sete Vales Suspensos") }}
|
||||
|
||||
**Serra da Estrela** En udfordrende bjergvandring, hvor du kan opleve Portugals højeste punkt og fantastisk panoramaudsigt. {{ link_to(url="https://www.centerofportugal.com/", title="Serra da Estrela") }}
|
||||
|
||||
**Madeira Levada Walks** Unikke stier langs Madeiras gamle kunstvandingskanaler med frodig vegetation og storslåede udsigter. {{ link_to(url="https://visitmadeira.com/en/", title="Madeira Levada Walks") }}
|
||||
|
||||
**Cabo da Roca til Praia da Ursa** En kort, men udfordrende tur til Portugals vestligste punkt og en skjult strand. {{ link_to(url="https://www.visitportugal.com/", title="Cabo da Roca til Praia da Ursa") }}
|
||||
|
||||
**Fishermen’s Trail** En del af Rota Vicentina, som kombinerer kystnære stier med traditionelle fiskerlandsbyer {{ link_to(url="https://rotavicentina.com/en/fishermens-trail/", title="Fishermen’s Trail") }}
|
||||
|
||||
**Alvão Natural Park** En skjult perle med vandfald, dyreliv og rolig atmosfære i det nordlige Portugal. {{ link_to(url="https://www.natural.pt/", title="Alvão Natural Park") }}
|
||||
|
||||
**Azorerne – São Miguel Island** Vandreture omkring Lagoa das Sete Cidades eller Lagoa do Fogo med vulkanske landskaber. {{ link_to(url="https://www.visitazores.com/", title="Azorerne – São Miguel Island") }}
|
||||
|
||||
**Paiva Walkways** En imponerende gangsti langs floden Paiva, der byder på uspoleret natur og træbroer. {{ link_to(url="https://www.passadicosdopaiva.pt/", title="Paiva Walkways") }}
|
||||
|
||||
## Roadtrip i bil
|
||||
At udforske Portugal på fire hjul er en fantastisk måde at opleve landets skjulte skatte, varierede landskaber og kulturelle mangfoldighed. Her er nogle anbefalede roadtrips:
|
||||
|
||||
**Algarve Kysten** Kør langs Algarve-kysten og oplev dramatiske klippeformationer, idylliske strande og autentiske landsbyer. Denne guide giver dig de bedste sceniske ruter i Algarve, hvor du kan nyde en blanding af natur, historie og lokal kultur. {{ link_to(url="https://www.algarvefun.com/blog/the-best-scenic-drives-in-the-algarve/", title="Læs om de bedste ruter langs Algarve-kysten") }}
|
||||
|
||||
**Dourodalen** Følg Douro-floden gennem det verdensberømte vinområde, og stop ved vingårde og udsigtspunkter. Denne artikel tilbyder detaljerede ruter og insider-tips, der gør din tur til Dourodalen både smagfuld og mindeværdig. {{ link_to(url="https://www.winetourismportugal.com/en/blog/road-trips-in-douro-valley-the-best-routes/", title="Oplev Dourodalens bedste roadtrips") }}
|
||||
|
||||
**Lisboa til Sintra og Cascais** En kort, men oplevelsesrig tur, der byder på historiske slotte, kystlandskaber og en charmerende by. Denne guide hjælper dig med at planlægge den perfekte dagstur fra Lissabon til Sintra og Cascais, så du får det bedste ud af denne ikoniske rute. {{ link_to(url="https://www.traveldrafts.com/the-perfect-day-trip-from-lisbon-to-sintra-and-cascais/", title="Planlæg din tur fra Lissabon til Sintra og Cascais") }}
|
||||
|
||||
**Alentejo Region** Udforsk regionens rullende bakker, olivenlunde, middelalderlandsbyer og uspolerede strande. Denne rejseblog beskriver en unik roadtrip gennem Alentejo, der fremhæver alt fra vinmarker til historiske perler. {{ link_to(url="https://www.followmeaway.com/alentejo-portugal-road-trip/", title="Tag på en uforglemmelig tur gennem Alentejo") }}
|
||||
|
||||
**Nordportugal – Porto til Braga** En tur gennem det historiske nord med kulturelle oplevelser, smuk natur og gastronomiske højdepunkter. Guiden beskriver nøgleattraktioner og praktiske tips til at nyde denne rute fuldt ud. {{ link_to(url="https://porto-north-portugal.com/porto-to-braga-how-to-get-there.html", title="Find inspiration til turen fra Porto til Braga") }}
|
||||
|
||||
**Serra da Estrela** En bjergkørsel, hvor du kan opleve Portugals højeste punkt og smukke landsbyer. Denne guide tager dig gennem en detaljeret rejseplan med fantastiske udsigtspunkter og lokale oplevelser. {{ link_to(url="https://www.centerofportugal.com/blog/serra-da-estrela-itinerary", title="Udforsk Serra da Estrelas bjerglandskaber") }}
|
||||
|
||||
**Azorerne – São Miguel Island** En roadtrip gennem vulkanske landskaber, varme kilder og frodige dale. Denne rejseblog giver dig detaljerede ruter og anbefalinger til at udforske São Miguel Island på bedst mulig vis. {{ link_to(url="https://www.earthtrekkers.com/sao-miguel-road-trip-azores/", title="Oplev São Miguel Island med denne guide") }}
|
||||
|
||||
**Porto til Douro-dalen** En rute fyldt med charmerende landsbyer, historiske byer og mulighed for vinsmagning. Lonely Planet fremhæver de smukkeste køreture og de bedste stop undervejs i Douro-dalen. {{ link_to(url="https://www.lonelyplanet.com/articles/road-trip-douro-valley", title="Planlæg din roadtrip fra Porto til Douro-dalen") }}
|
||||
|
||||
**Lissabon til Algarve** Tag den naturskønne rute via Setúbal og Costa Vicentina for en oplevelse uden for de store veje. Denne artikel guider dig gennem højdepunkterne på vejen mellem Lissabon og Algarve, fra naturparker til hemmelige strande. {{ link_to(url="https://www.roadtrippers.com/magazine/lisbon-to-algarve-road-trip/", title="Find de bedste stop mellem Lissabon og Algarve") }}
|
||||
|
||||
**Estorilkysten** Oplev den smukke kystlinje, der strækker sig fra Lissabon til Cascais og videre til Sintra. Denne blog giver en indgående beskrivelse af, hvordan du kan nyde denne kyststrækning med smuk natur og kulturelle oplevelser. {{ link_to(url="https://juliedawnfox.com/estoril-coast-portugal/", title="Oplev Estorilkystens højdepunkter") }}
|
||||
BIN
data/Hverdag/images/158170.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
data/Hverdag/images/Fachada_SaoJorge.jpg
Normal file
|
After Width: | Height: | Size: 109 KiB |